socket
の全体のポイントはsend()
とrecv()
にあるクライアントとサーバ間のデータを(受信)。サーバーに接続した後、サーバーにいくつかのデータ(空の文字列を送信する必要がある)を送信する必要があります。サーバーはクライアントにデータを返したり、接続を閉じることがあります。
my_client.py
import socket
sock = socket.socket()
sock.connect(('localhost', 8081))
sock.send(b'data from client')
print(sock.recv(32))
sock.close()
my_server.py
import asyncore
import socket
import time
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(1024)
print('data from client', data)
self.send(b'data from server')
self.close()
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(2)
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print('Incoming connection from %s' % repr(addr))
handler = EchoHandler(sock)
def main():
host = 'localhost'
port = 8081
server = EchoServer(host, port)
print('Server %s running' % port)
asyncore.loop()
if __name__ == '__main__':
main()
更新:あなたはすべて読まなくても、サーバーでソケットをクローズしているためOSError: [WinError 10038]
:あなたはエラーが出るん
クライアントからのデータ。クライアント側でも同じことが起こっています。
Pythonのドキュメントでは、これらがvery basic
の例であることが明示されています。
すべてのデータが送信されることを確認するには、sendall()
メソッドを使用してください。メソッドsend()
はすべてのデータの送信を保証しません。
あなたはこのようなwhile
ループとソケットからデータを読み取る必要があります。
my_client.py
import socket
sock = socket.socket()
sock.connect(('localhost', 8081))
sock.sendall(b'data from client')
chunk = b'' # socket.recv returns bytes
data = b'' # defined before to avoid NameError
while True:
chunk = sock.recv(32)
if chunk:
data += chunk
else:
break
print(data)
sock.close()
my_server.py
import asyncore
import socket
import time
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
chunk = b'' # socket.recv returns bytes
data = b'' # defined before to avoid NameError
while True:
chunk = self.recv(1024)
if chunk:
data += chunk
else:
break
print('data from client', data)
self.sendall(b'data from server')
self.close()
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(2)
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print('Incoming connection from %s' % repr(addr))
handler = EchoHandler(sock)
def main():
host = 'localhost'
port = 8081
server = EchoServer(host, port)
print('Server %s running' % port)
asyncore.loop()
if __name__ == '__main__':
main()
あなたはどのようなエラーが出るのですか? –
エラーと例外はありませんが、関数handle_accept()はクライアントへの2回目の接続からのみ実行されます。 – Viktor
私はドキュメントから離れて、 'asyncore'に慣れていませんが、' handle_except'で 'accept'を呼ぶべきではないと思います。サーバは、おそらく接続を受け入れた後にその関数を呼び出すため、冗長です。 –