python socket多线程聊天室求助!!!

cscadoge 2018-03-03 04:23:51
服务端

# -*- coding: UTF-8 -*-
import socket
import threading
users=[]#存储连接的对象
class state:
def __init__(self,data,addr):
self.data=data
self.addr=addr
def logout(self):
message=self.addr[0]+": logout"#地址+退出消息
return message
def online(self):
message=self.addr[0]+": "+self.data#地址+端口号
return message

def running(conn,addr):
try:
while True:
data=conn.recv(1024)
state_now=state(data,addr)
if not data or data =="exit":#输入exit退出
word=state_now.logout()
sendall(word)
break#跳出循环关闭连接
else:
word=state_now.online()
sendall(word)
conn.close()#关闭连接
except:
exit(0)

def sendall(word):#遍历对象把消息发给所有对象
for i in users:
i.send(word)

def main():
port=1234
print ("server start at port "+str(port))
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#地址复用
s.bind(('127.0.0.1',port))
s.listen(5)
while True:
conn,addr=s.accept()
users.append(conn)#把对象存储到数组中
t=threading.Thread(target=running,args=(conn,addr))
t.start()

if __name__=='__main__':
main()


客户端

import socket
import threading
def send(sock):
while True:
word=raw_input()
sock.send(word)
if word=="exit":
break
sock.close()
print "logout!!!"

def recv(sock):
while True:
data=sock.recv(1024)
print data

def main():
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('127.0.0.1',1234))
t1=threading.Thread(target=send,args=(sock,))
t2=threading.Thread(target=recv,args=(sock,))
t1.start()
t2.start()

if __name__=='__main__':
main()

漏洞很多,只求能个正常发送信息和退出。
问题是这样的,在客户端退出的时候,客户端会报错。再次连接服务端,客户端不能达到正常效果,不知道问题出在哪里。求大神帮忙。

...全文
726 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cscadoge 2018-03-07
  • 打赏
  • 举报
回复
客户端的问题也同样这样,连接已经关闭还是被要求接收客户端转发的内容,暴力解决办法 try excepet无视就可以了
cscadoge 2018-03-07
  • 打赏
  • 举报
回复
经过一段时间的思考和参考别人的代码,发现了问题所在。
主要是服务端连接关闭连接,但是连接对象还在数组当中,所以当客户端有内容发过来(内容被转发的时候),被关闭的对象就会报错。

oyljerry 2018-03-03
  • 打赏
  • 举报
回复
bad file descripter。文件对象不正确了。
cscadoge 2018-03-03
  • 打赏
  • 举报
回复

37,722

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧