Python基于TCP实现聊天功能

简介: Python基于TCP实现聊天功能

Server端

import socket
import queue
import threading
import time
#socket.AF_INET指定使用IPv4地址族,socket.SOCK_STREAM指定使用TCP协议
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
print("服务器IP: "+socket.gethostbyname(host))
serversocket.bind((host, 9090))
serversocket.listen(5)
#存放已连接的对象
clients = []
#存放公共消息的容器
public_message = dict()
#接收新的对象
def init():
    while True:    
        # 当心客户端连接时
        client,addr = serversocket.accept()  #阻塞线程
        if client in clients:
            print('老用户')
        else:
            print('新的用户加入:',end='')
            print(client.getpeername()[0])
            client.send(bytes('欢迎来到聊天室(匿名)!'.encode('utf-8')))
            clients.append(client)
      #线程启动时会调用receive_msg函数,args为传递给函数的参数元组
            r = threading.Thread(target=receive_msg,args=(client,))
            r.start()
#接收消息
def receive_msg(client):
    while True:
        time.sleep(1)
        try:
            if client in clients:
                data = client.recv(1024).decode('utf-8')
                if data!='':
                    print(data)
                    public_message[client] = queue.Queue()
                    public_message[client].put(data)
                else:
                    if client in clients:
                        print("用户优雅的退出了")
                        clients.remove(client)
           
        except BaseException as error:
            print('用户强制中断了一个连接')
            # print('错误:',error)
            if client in clients:
                clients.remove(client)
#转发消息(非/阻塞)
def broadcast():
    while True:
        if len(clients)>1:
            public_message_clone = [i for i in public_message]   #解决字典迭代中操作报错的问题
            for client in clients:
                for i in public_message_clone:
                    if i!=client and public_message[i].empty()==False:
                        data = public_message[i].get_nowait()  #注意
                        if data !='':
                            # 转发消息给客户端
                            client.send(bytes(data.encode('utf-8'))) 
                            print('服务器转发了消息')
         
                    
t1 = threading.Thread(target=init)
t2 = threading.Thread(target=broadcast)
t1.start()
t2.start()
#主线程监听在线人数
while (True):
    print("当前在线人数为:%d"%(len(clients)))
    time.sleep(5)

Client

import socket,threading
#客户端想要发消息和收消息同时进行,需要使用多线程达到并发效果
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# 获取计算机name
host = socket.gethostname()
# 获取根据计算机name获取计算机IP
host = socket.gethostbyname(host);
print(host)
s.connect((host, 9090))
# 接收消息
def receive():
    while True:
        data = s.recv(1024).decode('utf-8')
        if data!='':
            print(data)
# 发送消息
def send_msg():
    while (True):
        msg = input(':')
        if msg=='exit':
            s.close()
            break
        s.send(bytes(msg.encode('utf-8')))
        
t1 = threading.Thread(target=receive,daemon=True)
t1.start()
send_msg()

相关文章
|
6月前
|
网络协议 网络性能优化 Python
在Python中进行TCP/IP网络编程
在Python中进行TCP/IP网络编程
81 6
|
6月前
|
缓存 网络协议 Python
Python网络编程(二)编写TCP协议程序
Python网络编程(二)编写TCP协议程序
153 0
|
网络协议 Python
154 python网络编程 - TCP案例(模拟QQ聊天)
154 python网络编程 - TCP案例(模拟QQ聊天)
69 0
|
网络协议 Python
151 python网络编程 - TCP相关介绍
151 python网络编程 - TCP相关介绍
31 0
|
1月前
|
网络协议 Python
Python创建一个TCP服务器
Python创建一个TCP服务器
|
3月前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
3月前
|
存储 网络协议 Python
Python如何用PyModbus库进行Modbus TCP通信
使用python解决工业通信问题是一个非常好的选择,python具有丰富的生态,可以轻松解决工业通信的各种问题。 本篇主要介绍使用pymodbus库进行modbus tcp仿真,实现pc端读取plc或工业设备modbus变量。
|
4月前
|
网络协议 Python
python对tcp协议栈进行优化之一
**TCP优化摘要:** - MSS优化涉及调整TCP最大段大小,Python中可使用`socket.getsockopt()`查询MSS。 - Scapy是Python库,用于创建和发送网络包,可用于测试和优化协议栈性能。 - LwIP是轻量级TCP/IP协议栈,适合嵌入式设备,可通过分析和调整提升性能,特别是实时性和资源管理。
|
5月前
|
移动开发 网络协议 视频直播
25.Python 网络编程:TCP和UDP编程
25.Python 网络编程:TCP和UDP编程
46 2
|
6月前
|
消息中间件 网络协议 开发工具
MQ产品使用合集之rocketmq5.x只有tcp接入点吗,python sdk需要http接入点,请问怎么使用
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
207 2