我一直在試圖編寫Python中一個簡單的聊天服務器,我的代碼如下:Python的套接字錯誤 - 的recv()函數
import socket
import select
port = 11222
serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1024)
serverSocket.bind(('',port))
serverSocket.listen(5)
sockets=[serverSocket]
print 'Server is started on port' , port,'\n'
def acceptConn():
newsock, addr = serverSocket.accept()
sockets.append(newsock)
newsock.send('You are now connected to the chat server\n')
msg = 'Client joined',addr.__str__(),
broadcast(msg, newsock)
def broadcast(msg, sourceSocket):
for s in sockets:
if (s != serverSocket and s != sourceSocket):
s.send(msg)
print msg,
while True:
(sread, swrite, sexec)=select.select(sockets,[],[])
for s in sread:
if s == serverSocket:
acceptConn()
else:
msg=s.recv(100)
if msg.rstrip() == "quit":
host,port=socket.getpeername()
msg = 'Client left' , (host,port)
broadcast(msg,s)
s.close()
sockets.remove(s)
del s
else:
host,port=s.getpeername()
msg = s.recv(1024)
broadcast(msg,s)
continue
運行的服務器,並通過Telnet連接後,服務器讀取單個字符並跳過下一個字符。例如,如果我在telnet中鍵入Hello,服務器將讀取H l o。 有什麼幫助嗎?! :)
這裏不是你的實際問題,但是你需要在這裏改變socket.getpeername()爲s.getpeername(),並且處理掉連接而不先發送「quit」的客戶端。 – abarnert 2012-07-09 18:56:08
我實際上使用套接字而不是s來獲取套接字成員列表,並忘記將其更改。 – 2012-07-09 19:09:38