双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

python3 如何实现实时聊天功能

cyx441984694 cyx441984694 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
小白请教python3聊天室功能实现

代码来源:http://blog.csdn.net/calling_wisdom/article/details/42524745

用pycharm测试时候发现,Client那边,A输入一行字,B不能马上收到。需要B先打东西,然后才能收到A的信息。与此同时,A才能收到。
跪求大神解答。好像是threading的问题,还是说pycharm的问题?

Server:

#!/usr/bin/python3
#coding=utf-8

from socket import *
from threading import Thread

HOST='localhost'
PORT=5550
BUFSIZE=1024
ADDR=(HOST,PORT)

Sock = socket(AF_INET,SOCK_STREAM)
Sock.bind(ADDR)
Sock.listen(5)
print("Server 127.0.0.1 listening...")

mydict=dict()
mylist=list()

##whatToSay send to all exceptNum
def tellOthers(mynum,whatToSay):
for c in mylist:
if c.fileno() != mynum:
try:
c.send(whatToSay.encode())
except:
pass

def subThreadIn(myconnection,connNumber):
nickname = myconnection.recv(BUFSIZE).decode()
mydict[myconnection.fileno()]=nickname
mylist.append(myconnection)
print('Connection',connNumber,'has nickname:',nickname)
while True:
try:
recveMsg=myconnection.recv(BUFSIZE).decode()
if not recveMsg:
pass
else:
print(mydict[connNumber],':',recveMsg)
tellOthers(connNumber,mydict[connNumber]+':'+recveMsg)
except(OSError,ConnectionResetError):
try:
mylist.remove(myconnection)
except:
pass
print(mydict[connNumber],'exit,',len(mylist),'person left')
tellOthers(connNumber,'[Remind:'+mydict[connNumber]+' has left the chatting room]')
myconnection.close()
return

while True:
connection,addr=Sock.accept()
print('Accept a new connection',ADDR,connection.fileno())
try:
buf = connection.recv(BUFSIZE).decode()
if buf == '1':
connection.send(b'Welcome to server!') ##Client端显示

mythread = Thread(target=subThreadIn,args=(connection,connection.fileno()))
mythread.setDaemon(True)
mythread.start()
else:
connection.send(b'please go out!')
connection.close()
except:
pass


##Client

from socket import *
from threading import Thread

HOST='localhost'
PORT=5550
BUFSIZE=1024
ADDR=(HOST,PORT)

Sock=socket(AF_INET,SOCK_STREAM)

Sock.connect(ADDR)

Sock.send(b'1')
print(Sock.recv(BUFSIZE).decode())
nickname=input("input your nickname:")
Sock.send(nickname.encode())

def sendThreadFunc():
while True:
try:
myword=input(">>>")
myword=myword.encode('utf-8')
print(Sock.recv(BUFSIZE).decode()) ##这里先后顺序并没有差别的。
Sock.send(myword)
except ConnectionAbortedError:
print('Warning! The connection is aborted!')
except ConnectionResetError:
print("Warning! The connection is reset!")

def recvThreadFunc():
while True:
try:
otherword=Sock.recv(BUFSIZE)
if otherword:
print(otherword.decode())
else:
pass
except ConnectionResetError:
print("Warning! The connection is reset!")
except ConnectionAbortedError:
print("Warning! The connection is aborted!")

send1=Thread(target=sendThreadFunc)
recv1=Thread(target=recvThreadFunc)
threads=[send1,recv1]

for t in threads:
t.setDaemon(True)
t.start()
t.join()
...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
cyx441984694
脚本语言 37,738 成员 34,208 内容