首页 > 编程语言 >Python基于TCP实现聊天功能

Python基于TCP实现聊天功能

时间:2024-03-09 16:45:37浏览次数:23  
标签:socket Python clients TCP client 聊天 print data public

Server端

import socket
import queue
import threading
import time

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)
            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()

image

标签:socket,Python,clients,TCP,client,聊天,print,data,public
From: https://www.cnblogs.com/aeolian/p/18062919

相关文章

  • python Ai 应用开发基础训练,字符串,字典,文件
    --------------------------------------  编程能是大模型应用的天花板..................................................................所以要好好将大模型应用在企业一定要好好练好最看不起的一环,基础能力字符串处理 本文档来自老男孩培训Alex课程记录,我在2017年......
  • Qt ModbusTCP通讯
    前言Modbus在工业控制中的应用非常多,由于其免费使用加上一定的历史环境,Modbus在PLC上的通讯应用非常多,本文主要介绍MosbusTCPmaster(主站)的实现。一、关于ModbusModbus是由MODICON公司开发的一种工业现场总线协议标准,随后施耐德推出了基于TCP/IP的MOdbus协议:Modbustcp;......
  • python+pytest接口自动化之测试函数、测试类/测试方法的封装
    前言今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。例如单个接口的请求代码如下:importrequestsheaders={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,l......
  • ModbusTCP协议报文详细分析
    ModbusTCP与ModbusUDP的报文格式是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的协议进行分析,ModbusTCP与ModbusRtu(ModbusASCII)之间的区别如下图:从上图可以看出,ModbusTCP在Modbus串行通信的基础上,去除了校验(由于TCP本身就带有校验和)和设备地址(M......
  • Qt 基于QTcpSocket的ModbusTCP协议
    一、编写缘由1.发现问题最近项目上要把之前的modbusRTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连modbuss......
  • 【Python使用】python高级进阶知识md总结第1篇:My Awesome Book【附代码文档】
    python高级进阶全知识知识笔记总结完整教程(附代码资料)主要内容讲述:MyAwesomeBook,MyAwesomeBook。MyAwesomeBook,MySQL数据库。MyAwesomeBook,聚合函数。MyAwesomeBook,创建表并给某个字段添加数据。MyAwesomeBook,闭包。MyAwesomeBook,路由列表功能开发。MyAwesomeBoo......
  • vscode编写python
    安装插件打开cmd创建虚拟环境C:\Users\ychen>condacreate-nenv_devpython=3.10.4Fetchingpackagemetadata.................Solvingpackagespecifications:.PackageplanforinstallationinenvironmentC:\ProgramData\Anaconda3\envs\env_dev:Thefo......
  • python面向对象(一)
    面向对象(ObjectOrientedProgram)在Python中,所有的数据(包括数字和字符串)实际都是对象,同一类型的对象都有相同的类型。我们可以使用type()函数来获取关于对象的类型信息。什么是类,什么是对象?在Python中,使用类来定义同一种类型的对象。类(class)是广义的数据类型,能够定义复......
  • python迭代器、生成器与可迭代对象
    迭代(Iteration)如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),这些可以直接作用于for循环的对象统称为可迭代对象:Iterable方法是通过collections.abc模块的Iterable类型判断,一个对象是否为可迭代对象>>>fromcollections.......
  • python urllib.parse urlparse path url路径分割
    前言全局说明pythonurllib.parseurlparsepathurl路径分割一、获取路径部分#!/usr/bin/envpython3#coding:UTF-8#-*-coding:UTF-8-*-fromurllib.parseimporturlparseurl='http://www.baidu.com/aa/bb/cc/index.html'print("url:",url)parsed......