用python写一个tcp/ip协议的聊天软件

编写一个基于TCP/IP协议的简单聊天软件,可以让多个客户端连接到服务器,实现简单的文本消息收发功能。下面是一个基本的示例,涵盖了服务器端和客户端的实现。

  1. 服务器端(chat_server.py)
    服务器端负责接收客户端的连接,并转发消息给所有连接的客户端。
import socket
import threading# 服务器配置
SERVER_HOST = '0.0.0.0'  # 监听所有网络接口
SERVER_PORT = 12345      # 端口号# 存储所有客户端连接
clients = []def handle_client(client_socket, client_address):"""处理单个客户端的消息收发"""print(f"[新连接] {client_address} 已连接.")clients.append(client_socket)while True:try:# 接收客户端消息message = client_socket.recv(1024).decode('utf-8')if not message:breakprint(f"[{client_address}] {message}")# 广播消息给所有客户端for client in clients:if client != client_socket:client.send(message.encode('utf-8'))except Exception as e:print(f"[异常] 客户端 {client_address} 连接断开.")clients.remove(client_socket)client_socket.close()breakdef main():# 创建TCP套接字server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定和监听端口server_socket.bind((SERVER_HOST, SERVER_PORT))server_socket.listen(5)print(f"[服务器] 正在监听端口 {SERVER_PORT}...")try:while True:# 接受客户端连接client_socket, client_address = server_socket.accept()# 创建线程处理客户端消息client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))client_thread.start()except KeyboardInterrupt:print("\n[服务器] 服务器关闭.")server_socket.close()if __name__ == "__main__":main()
  1. 客户端(chat_client.py)
    客户端负责连接服务器,并发送和接收消息。
import socket
import threading# 服务器配置
SERVER_HOST = 'localhost'  # 服务器地址
SERVER_PORT = 12345        # 服务器端口号def receive_messages(client_socket):"""接收消息的线程函数"""while True:try:# 接收服务器消息message = client_socket.recv(1024).decode('utf-8')if message:print(message)except Exception as e:print("[异常] 与服务器断开连接.")client_socket.close()breakdef main():# 创建TCP套接字client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:# 连接服务器client_socket.connect((SERVER_HOST, SERVER_PORT))print(f"[连接成功] 已连接到服务器 {SERVER_HOST}:{SERVER_PORT}")# 启动接收消息的线程receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))receive_thread.start()# 发送消息while True:message = input()if message.lower() == 'exit':breakclient_socket.send(message.encode('utf-8'))except Exception as e:print(f"[异常] 无法连接到服务器 {SERVER_HOST}:{SERVER_PORT}")finally:client_socket.close()if __name__ == "__main__":main()

使用说明:
运行服务器端:
在命令行中执行 python chat_server.py,启动服务器监听端口。

运行客户端:
在另一个命令行窗口中执行 python chat_client.py,连接到服务器。
聊天功能:
客户端可以输入消息并按回车发送到服务器,服务器会将消息广播给所有连接的客户端。
退出:
客户端输入 exit 并按回车退出聊天。

注意事项:
程序中使用了多线程来处理服务器和客户端的并发连接和消息收发。

这只是一个简单的示例,没有加入身份验证、加密等安全性措施,请根据实际需求添加。
在实际使用中,需要考虑异常处理、网络稳定性等因素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单链表算法 - 链表分割

链表分割_牛客题霸_牛客网现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的。题目来自【牛客题霸】https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70思路: 代码: /* struct ListNode {int val;struct List…

英福康INFICON TranspectorWare v3 RGA软件操作说明

英福康INFICON TranspectorWare v3 RGA软件操作说明

Python一对一辅导答疑|Rust 德国

你好,我是悦创。 下面是答疑内容。 在 Rust 中,方法的调用方式通常取决于它们是如何定义的。在你的例子中,print_drink方法最初是作为一个接受Drink类型实例作为参数的关联函数(类似于静态方法)定义的。后来&#xff…

Python应用—从pdf中保存图片

import fitz # PyMuPDFdef extract_images_from_pdf(pdf_path, output_folder):# 打开PDF文件doc fitz.open(pdf_path)# 遍历PDF的每一页for page_number in range(len(doc)):# 获取当前页page doc[page_number]# 遍历页面中的所有图片for img_index, img in enumerate(page…

供应链管理(SCM):如何在颜值和体验上发力

要在供应链管理系统(SCM)中在颜值和体验上发力,让用户感觉耳目一新,可以采取以下措施: 界面设计优化: 对供应链管理系统的界面进行优化,注重界面的美观、简洁和易用性。采用现代化的设计风格、…

.Net--CLS,CTS,CLI,BCL,FCL

1.什么是CLS? 所以.NET专门为此参考每种语言(例如C# ,VB,F#)并找出了语言间的共性,然后定义了一组规则,开发者都遵守这个规则来编码,那么代码就能被任意.NET平台支持的语言所通用。 而与其说是规则&#x…

技能 | postman接口测试工具安装及使用

哈喽小伙伴们大家好!今天来给大家分享一款轻量级,高效好用的接口测试工具-postman. Postman是一个流行的API开发工具,主要用于测试、开发和文档化API。以下是关于Postman的介绍及其主要使用场景: Postman介绍: 1. 功能丰富的API客户端&#…

langchain 入门指南(二)- 如何跟大模型对话

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 本文中,我们会通过一个简单的例子来展示如何使用 langchain 来调用大模型的 chat API(使用 Chat Model&#xff…

在SpringCloud中如何轻松实现微服务间的通信

在Spring Cloud中,实现微服务间的通信非常简单。Spring Cloud提供了多种方式来进行微服务之间的通信,包括使用RestTemplate、Feign、Ribbon、Eureka等组件。下面我将详细介绍这些方式的使用方法。 使用RestTemplate进行通信: RestTemplate是S…

c++写数据结构进入文件

以下定义一个数据结构 struct SData {std::string url;int number;std::string memo; };写入文件 void StorageDataToFile(const std::string& filename, const SData& data) {std::ofstream outFile(filename);if (outFile.is_open()) {// 使用std::stringstream格式…

django报错(一):python manage.py makemigrations,显示“No changes detected”

执行python manage.py makemigrations命令无任何文件生成,结果显示“No changes detected”。 解决方案一: 1、执行命令:python manage.py makemigrations –empty appname 2、删除其中的0001_initial.py文件(因为这个文件内容是…

【docker 部署springboot项目】

一、docker安装 1.检查Linux内核版本高于3.10才可安装 uname -r 2. 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 3. 使用docker仓库进行安装 安装所需的软…

Qt MV架构-委托类

一、基本概念 与MVC模式不同,MV视图架构中没有包含一个完全分离的组件来处理与用户的交互。 一般地,视图用来将模型中的数据显示给用户,也用来处理用户的输入。为了获得更高的灵活性,交互可以由委托来执行。 这些组件提供了输入…

Python入门------pycharm加载虚拟环境

pycharm虚拟环境配置: 在按照前面的办法,配置好虚拟环境后,如果我们需要到虚拟环境开发,就需要给编译器配置虚拟环境 1.打开编译器,点击右下角的interpreter选项 2. 点击ADD Interpreter,添加虚拟环境 3. 因为我们使用的是原始…

欧式空间、傅里叶级数与希尔伯特空间的解释

欧式空间(欧几里得空间) 欧几里得几何就是中学学的平面几何、立体几何,在欧几里得几何中,两平行线任何位置的间距相等。 而中学学的几何空间一般是2维,3维(所以,我们讨论余弦值、点间的距离、内…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(下:数据操作与查询)

文章目录 DML数据操作语言1、新增记录2、删除记录3、修改记录 DQL数据查询语言1、查询记录2、条件筛选3、排序4、函数5、分组条件6、嵌套7、模糊查询8、limit分页查询 集合操作union关键字和运算符in关键字any关键字some关键字all关键字 联合查询1、广义笛卡尔积2、等值连接3、…

【事件排查】网络问题排查H3C无线优化方案

目录 背景 问题一 排查思路 解决方法 问题二 排查思路 解决方法 背景 公司进行搬迁,网络进行了调整 基于上篇文章《H3C Intelligent Management Center无线认证新增设备如何配置》 来做了一些网络配置,公司后续出现以下2个问题: …

在Linux系统安装MySQL有多简单

MySQL 是一种流行的开源关系数据库管理系统,广泛应用于各种类型的应用程序和服务。本文将介绍在 Linux 上安装 MySQL 的多种方式,包括离线安装、使用 Docker 容器、通过 Helm Chart 安装在 Kubernetes 集群中等。 前言 无论你是在开发环境中测试&#…

设计模式-概述*

1.代码的质量的评判 可维护性:不破坏原有代码设计以及不引入新的bug的前提下,能够快速修改或新增代码;可读性:人类能理解的代码(编程规范-命名、函数是否冗长、类是否过大等);可扩展性&#xff…

Android中ContentProvider学习记录

一 概述 在Android中,不管是sp键值对存储还是sqlite数据库存储,一般都是应用内的数据存储。而如果需要让数据跨应用共享,就需要使用到我们的内容提供者ContentProvider,比如系统的通讯录。它的底层是binder。 简单来说&#xff0…