Python实现聊天室全双工通信

学校的作业,用TCPSocket实现聊天室,课程中的只是简单的一对一对话,网上有用IO多路复用select的,有多线程的。

遇到的问题是recv阻塞问题,解决方法是设置客户端连接超时,无消息则捕获timeout异常并pass,继续处理其他连接的缓冲区。(吐槽:python还是把异常作为正常流程处理了,作为一个java基础的开发还是很难接受的),本来已经写完了,用网络测试工具做客户机总是无法断开连接,甚至能继续发消息,后来发现要把窗口叉掉才能断开,那断开按钮还有什么意义,坑啊。

以下代码

服务器:

客户端:

from threading import Thread
from socket import *
import time

tcpClientSocket = None

#接收服务器数据
def recvData():
    global tcpClientSocket
    while True:
        recvData = tcpClientSocket.recv(1024)
        if len(recvData)==0:
                print(服务器已关闭!)
                tcpClientSocket.close()
                break        
        print(recvData)
        time.sleep(1)

#发送数据
def sendData():
    global tcpClientSocket
    while True:
        sendData = input("")
        tcpClientSocket.send(sendData.encode())

def main():
    global tcpClientSocket
    tcpClientSocket = socket(AF_INET,SOCK_STREAM)
    serverIP = input("请输入服务器ip: ")
    serverPort = input("请输入服务器端口号: ")
    serverAdd = (serverIP,int(serverPort))
    tcpClientSocket.connect(serverAdd)

    tr = Thread(target=recvData)
    ts = Thread(target=sendData)

    tr.start()
    ts.start()

    tr.join()
    ts.join()

    tcpClientSocket.close()

if __name__ == "__main__":
    main()
经验分享 程序员 微信小程序 职场和发展