私は数ヶ月前から python を自己学習しており、最終的に Socket プログラミングを学習しています。教科書の課題として、半二重チャット システムを設計することになっています。以下はコードです。最初の要求と応答は問題ありませんが、クライアントから 2 番目のメッセージを送信しようとするたびに、サーバーがハングしているように見えます。プログラムは TCP ベースです。
新しいメッセージを送信する必要があるたびに ss.accept() が呼び出されているため、新しいスレッドが作成されているのではないかと疑っていますが、 client から sc.connect() を1回しか呼び出していないため、新しい接続である可能性がありますサーバー側で無限の時間そこにぶら下がっています。
証跡として: while ループの外側で ss.accept() を呼び出しました。
誰かがコードを見て、問題が正確にどこにあるのかを理解してください。
私は学んでいるので、まだツイストに移行していません。フレームワークに移行する前に、まずすべての基本を学びたいです。
!bin/usr/env python
import socket, sys
HOST =''
PORT = 1060
ADDR =(HOST,PORT)
def userinput(sock):
usermessage = input('>')
sock.sendall(str(len(usermessage)))
return usermessage
def server():
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(1)
print 'the server is listening at',s.getsockname()
while True:
ss,sockname = s.accept()
#listen to determine the bytes sent by client
msglen = ss.recv(4096)
#accept the complete message
msg = ss.recv(int(msglen))
print 'client:', repr(msg)
servermsg = userinput(ss)
ss.sendall(servermsg)
print " ---------------"
ss.close()
def client():
sc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sc.connect(ADDR)
while True:
message = userinput(sc)
sc.sendall(message)
replylen = sc.recv(4096)
reply = sc.recv(int(replylen))
print "reply:",reply
print "----------------"
sc.close()
if sys.argv[1:] == ['server']:
server()
elif sys.argv[1:] == ['client']:
client()
else:
print >> sys.stderr,'usage:tcp_2_7.py server|client[host]'