几个月以来,我一直在自学python,最后学习了Socket编程。作为一个课本练习,我应该设计一个半双工聊天系统。下面是代码。第一个请求和响应都很好,但每次我尝试从客户端发送第二条消息时,服务器似乎都挂断了。该程序基于TCP。
我怀疑,由于每次必须发送新消息时都会调用ss.accept(),因此会创建一个新线程,但由于我只从客户端调用了sc.connect()一次,所以我在服务器端的新连接可能会无限期地挂在那里。
作为一条线索:我在while循环外调用了ss.accept(),即只进行1次连接,并在while环路上一遍又一遍地听数据,对话运行良好
有人能看一下代码,帮我了解问题的确切位置吗。
从那以后,我在学习,我还没有动过歪。在转到框架之前,我想先学习所有的基础知识。
!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]'
您的试用-接受一次,然后接收多条消息-就是您应该做的。呼叫accept
是在等待新的连接-您不需要每次发送或接收消息时都这样做,就像您不希望每次发送或收到消息时都呼叫connect
一样。
这样想:
当你连接到聊天服务器时,你会立即连接、发送消息,然后断开连接吗?否-您有一个持续打开的连接,通过该连接发送消息,并且该连接仅在聊天会话结束时关闭。
来自accept
:上的文档
socket.accept()
接受连接。套接字必须绑定到地址和侦听连接。返回值是一对(conn,address)其中conn是可用于发送和在连接上接收数据,address是绑定到的地址连接另一端的插座。