前提・実現したいこと
pythonのsocketsモジュールを使って、送受信」ができるようなプログラムを作っています。サーバーのプログラムとクライアントのプログラムを両立させるためにはどうすればいいでしょうか。
該当のソースコード
python
1import socket 2import socketserver 3 4#サーバー 5class TCPHandler(socketserver.BaseRequestHandler): 6 def handle(self): 7 print(self.request.recv(1024).strip().decode()) 8 self.request.send(("hello world").encode("utf-8")) 9ip = socket.gethostbyname(socket.gethostname()) 10 11HOST = ip 12PORT = 34567 13socketserver.TCPServer.allow_reuse_address = True 14server = socketserver.TCPServer((HOST, PORT), TCPHandler) 15try: 16 server.serve_forever() 17except KeyboardInterrupt: 18 pass 19server = socketserver.TCPServer((HOST, PORT), TCPHandler) 20server.serve_forever() 21self.request.recv(1024).strip().decode() 22("hello world").encode("utf-8") 23 24#クライアント 25sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 26sock.connect((HOST,PORT)) 27sock.send(('Hello Raspberry').encode("utf-8")) 28receivedstr=sock.recv(1024) 29print(receivedstr.decode()) 30sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 31sock.connect((HOST,PORT)) 32receivedstr=sock.recv(1024)
引用:https://elsammit-beginnerblg.hatenablog.com/entry/2020/12/19/185338
試したこと
サーバーのプログラムとクライアントのプログラムを同じところに書きましたが。うまくいきません。
どういう処理をしたいのかを、日本語でちゃんと書きましょう。
うまくいかないと言われても何が起きてるか分からないので、具体的に何がどううまくいかないのか?(例えばエラーメッセージが出てるなら、そのエラーメッセージを質問文内に含めるなど)
またteratail初めたばかりだと思いますので、今一度こちらのページを参考にされて、質問文に必要な情報を追記してください。
参考)
https://teratail.com/help/question-tips
現状だとちょっと答えが出そうにないというか、エスパーが出てくるのを頼るしかない状況です。
追記)
なんとなくやりたいことは分かるのですが、サーバとクライアントまったく同じソースコードで動かそうとするのは無理があるかな?という気もしてます。Socket通信ならどっちから繋ぎににいくだけで、双方向のデータの送受信はできると思いますけど、あえてこういうことをされる意味がたぶん誰にも伝わらない気がしています。
エラーメッセージが出るわけではありません
エラーメッセージが出ないということは分かりましたが、うまくいかないというだけではとにかく状況がわからなすぎて回答者に伝わりませんので、その辺の情報をもっと質問文に追記した方が良いと思いますよ。
上でも書きましたが、Socket通信は通常はどちらかがクライアント、どちらかがサーバーになって1つの接続で互いに送受信するのがわりと一般的だと思いますが、このプログラムはそれぞれがクライアントとサーバになって接続2本にしようとしてるように見受けられます。一般的な方法じゃないと思うので、otnさんも書いていますがどういう目的でどういう処理をしたいのか(なぜ、このような一般的な方法じゃないことをあえて選択しているのか?)も質問文内にしっかり記載した方がいいと思います。
質問文は追記や更新ができます。
一般的なのは例えば何でしょうか?
一般的な方法はすでに書いてます。参考サイトもその方法で書かれてるのに、なぜともに両方がクライアントとサーバーになる方法で通信を試みるのかがちょっと分かりません(確かにそういう実装が必要な場合もあるのですが、何となくですが必要がないのに実装しようとしてるように見えます)
軽くソースコード見た限りだとともに受信待ちになって、送信の処理までちゃんと進んでるのかな?とも思いますし、その辺もしっかり確認した方が良いのでは?とも思います。かつ、その点は質問文にもしっかり説明を入れた方が良いと思います。
分かりました。ちょっと考えてみます。
回答1件
あなたの回答
tips
プレビュー