Python 编写多个 TCP Client一起聊天程序

这篇具有很好参考价值的文章主要介绍了Python 编写多个 TCP Client一起聊天程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python 编写多个 TCP Client一起聊天程序

目录

Python 编写多个 TCP Client一起聊天程序

查询电脑IP地址

建立TCP Client端

建立TCP Server端

建立通信

查询电脑IP地址

首先可以通过进入命令窗口之后,输入:ipconfig ,按下回车即可看到着整个电脑的ip详细信息,这里可以看到IPv4 地址为: 10.88.34.234

python tcp client,tcp/ip,服务器,网络

或者也可以通过网络与共享中心中的已链接的网络,看到网络的详细IP配置信息。

python tcp client,tcp/ip,服务器,网络

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。在通信开始之前,一定要先建立相关的链接,才能发送数据

建立TCP Client端

下面为简单的TCP客户端,用于连接到指定的服务器地址和端口,发送一条消息,然后关闭连接。客户端是单次交互的,即它发送一条消息后就关闭了连接。想要使其成为一个完整的聊天客户端,它需要能够持续接收和发送消息,直到用户决定退出。

  1. import socket
    # 1.创建socket
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2. 链接服务器
    server_addr = ("10.88.34.234", 7002)
    tcp_socket.connect(server_addr)
    
    # 3. 发送数据
    send_data = input("请输入要发送的数据:")
    tcp_socket.send(send_data.encode("gbk"))
    
    # 4. 关闭套接字
    tcp_socket.close()

根据提供的代码进行改进,可以持续发送和接收消息,直到用户输入特定的命令(例如"exit")来关闭连接,同时,在多线程环境中,确保线程安全性是非常重要的,特别是涉及到共享资源(如 socket)时。当多个线程同时试图发送消息,可能导致发送的数据混乱,或者产生异常。

使用锁(threading.Lock)来保护共享资源,确保在某一时刻只有一个线程能够访问这个资源。在代码中添加一个锁,以确保在发送消息时不会被其他线程中断:

  1. import socket
    import threading
    
    # 添加一个锁
    send_lock = threading.Lock()
    
    def receive_messages(client_socket):
        try:
            while True:
                data = client_socket.recv(1024)
                if not data:
                    break
                print(data.decode('gbk'))
        except Exception as e:
            print(f"Error receiving messages: {e}")
    
    def send_message(tcp_socket, message):
        # 使用锁确保发送操作的原子性
        with send_lock:
            tcp_socket.send(message.encode('gbk'))
    
    def start_client(server_addr):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcp_socket:
            tcp_socket.connect(server_addr)
    
            # 启动接收消息的线程
            receive_thread = threading.Thread(target=receive_messages, args=(tcp_socket,))
            receive_thread.start()
    
            while True:
                send_data = input("请输入要发送的数据:")
                if send_data.lower() == "exit":
                    break
    
                # 调用发送消息的函数
                send_message(tcp_socket, send_data)
    
            receive_thread.join()
    
    if __name__ == "__main__":
        server_addr = ("10.88.34.234", 7002)
        start_client(server_addr)

python tcp client,tcp/ip,服务器,网络

建立TCP Server端

在程序中,如果想要完成一个TCP服务器的功能,需要以下流程:1. socket创建一个套接字;2. bind绑定ip和port;3. listen使套接字变为可以被动链接;4. accept等待客户端的链接,5. recv接收数据

基本的TCP服务器,它可以监听指定的IP地址和端口,接受客户端的连接请求,并接收来自客户端的数据。

  1. import socket
    
    # 创建socket
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 本地信息
    address = ('10.88.34.234', 7002)
    
    # 绑定
    tcp_server_socket.bind(address)
    
    tcp_server_socket.listen(128)
    
    while True:
        # 等待新的客户端连接
        client_socket, clientAddr = tcp_server_socket.accept()
    
        # 接收对方发送过来的数据
        recv_data = client_socket.recv(1024)  # 接收1024个字节
        print('接收到的数据为:', recv_data.decode('gbk'))
    
        client_socket.close()
    
    tcp_server_socket.close()

修改后的代码可以支持多客户端,并且使客户端之间可以互相通讯:使用多线程处理每个客户端连接。保存所有活跃的客户端连接,以便可以将消息转发给所有客户端。

可以处理多个客户端的连接,并将任何客户端发送的消息转发给所有其他客户端。当客户端断开连接时,服务器将从列表中移除该客户端,并关闭相应的socket。当服务器接收到来自客户端的消息时,它会在消息前添加发送者的地址信息,然后将这个消息转发给所有其他客户端。

  1. import socket
    import threading
    
    def handle_client(client_socket, client_addr, all_clients):
        while True:
            try:
                # 接收数据
                recv_data = client_socket.recv(1024)
                print(f"接收到来自 {client_addr} 的数据: {recv_data.decode('gbk')}")
                if recv_data:
                    # 构建带有发送者地址的消息
                    message = f"接收到来自 {client_addr} 的数据: {recv_data.decode('gbk')}"
                    # 转发数据给所有客户端
                    broadcast(message.encode('gbk'), client_socket, all_clients)
                else:
                    # 如果接收的数据为空,则表示客户端已经断开
                    remove_client(client_socket, all_clients)
                    break
            except ConnectionResetError:
                # 处理客户端异常断开的情况
                remove_client(client_socket, all_clients)
                break
    
    def broadcast(message, sender_socket, all_clients):
        for client in all_clients:
            if client is not sender_socket:
                try:
                    client.send(message)
                except Exception as e:
                    print(f"Error sending message to client: {e}")
    
    def remove_client(client_socket, all_clients):
        client_socket.close()
        all_clients.remove(client_socket)
        print(f"Removed client: {client_socket}")
    
    def start_server():
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.bind(('10.88.34.234', 7002))
        server_socket.listen(128)
    
        all_clients = []
    
        while True:
            client_socket, client_addr = server_socket.accept()
            print(f"Accepted connection from {client_addr}")
            all_clients.append(client_socket)
    
            client_thread = threading.Thread(target=handle_client, args=(client_socket, client_addr, all_clients))
            client_thread.start()
    
    if __name__ == "__main__":
        start_server()

python tcp client,tcp/ip,服务器,网络

建立通信

打开四个进程,第一个进程用于运行TCP Server程序,其余三个作为不同的三个TCP Client端。分别运行并建立连接并通信。

当Client1发送消息时

python tcp client,tcp/ip,服务器,网络

服务器和其他两个Client均接收到消息

python tcp client,tcp/ip,服务器,网络

python tcp client,tcp/ip,服务器,网络

python tcp client,tcp/ip,服务器,网络

client在接收到其他client发送过来的消息后,也可以再次发送消息,直至发送exit后退出

python tcp client,tcp/ip,服务器,网络

当客户端断开连接时,服务器将从列表中移除该客户端,并关闭相应的socket。

python tcp client,tcp/ip,服务器,网络文章来源地址https://www.toymoban.com/news/detail-858439.html

到了这里,关于Python 编写多个 TCP Client一起聊天程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python编写TCP和UDP测试工具

    通过python编写的TCPUDP协议的客户端和服务端,支持IPV4和IPV6的网络环境,同时新增加客户端ip和端口绑定功能。 client客户端 server服务端 python3.x和python2.x代码逻辑一致,只是部分函数写法不一样,只需要修改写法后同样可以在python2.x环境使用 1、python3.x的print()函数有括号,py

    2024年02月03日
    浏览(39)
  • 使用python编写脚本测试目标主机的TCP端口连通性

            使用Python的Socket模块的connect()函数来尝试连接目标主机的特定端口。如果连接成功,则说明该端口是打开的;否则,该端口是关闭的。         下面是一个示例脚本,可以检测目标IP的22端口是否开启:         在这个程序中,我们首先使用socket模块创建一

    2024年02月11日
    浏览(34)
  • 【python】类似FileZilla Client的程序

    可以使用Python和GTK(GIMP Toolkit)来创建一个类似于FileZilla客户端的图形用户界面(GUI)程序。GTK是一种流行的跨平台工具包,可以用来开发GUI应用程序,它是GNOME桌面环境的核心部分。Python有几个库可以与GTK绑定,例如PyGTK (适用于GTK 2) 或者较新的PyGObject (适用于GTK 3和GTK 4)。

    2024年02月21日
    浏览(29)
  • python编写一个小程序,python入门小程序编写

    大家好,小编来为大家解答以下问题,python编写一个小程序,python入门小程序编写,现在让我们一起来看看吧! 大家好,小编为大家解答python简单易懂的小程序的问题。很多人还不知道python入门小程序编写,现在让我们一起来看看吧! 20个小段程序 1.字符串翻转 运行结果:

    2024年02月03日
    浏览(38)
  • python编写小程序有界面,python编写小程序的运行

    大家好,小编为大家解答python编写小程序怎么看代码的的问题。很多人还不知道python编写小程序的运行,现在让我们一起来看看吧!   Python第一个简单的小游戏 temp = input(\\\"请猜一猜姐姐的幸运数字是: \\\") guess = int(temp) if guess == 6: # 此处是需要使用双等号,表示等于,若使用单

    2024年02月14日
    浏览(41)
  • python编写小程序小游戏,python编写小程序的运行

    本篇文章给大家谈谈python编写小程序需要注意的地方,以及python编写小程序怎么看代码的,希望对各位有所帮助,不要忘了收藏本站喔。 Source code download: 本文相关源码 python可以开发小程序吗 谷歌人工智能写作项目:小发猫 用python可以做微信小程序吗? 其实微信小程序作为

    2024年03月12日
    浏览(37)
  • 用python编写一个小程序,如何用python编写软件

    大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 我想有人曲解意思了,人家说用python开发渣蔽一个手机app,不是说用手机敲写python代码,当然可以啊,只不过在电脑上开发的应用软件要进行打包什么的,才能

    2024年02月07日
    浏览(38)
  • 用python编写用户登录界面,用python编写登录程序

    大家好,小编为大家解答用python编写用户登录界面的问题。很多人还不知道用python编写登录程序,现在让我们一起来看看吧! python编写一个脚本的腊厅具体操作: 1、首先,打开python并创建一个新的PY文件。 2、其次,import os,因为涉及系统文件的路径,因此首先轮烂隐在此处

    2024年02月05日
    浏览(41)
  • python制作小程序制作流程,python入门小程序编写

    大家好,小编来为大家解答以下问题,python制作小程序制作流程,python入门小程序编写,现在让我们一起来看看吧! Python小程序集锦 程序1:数字组合 程序2:猜数字 程序3:猜时间 程序4:判断整数大小 程序5:斐波那契数列 程序6:水仙花数 程序7:数字求和 程序8:平方根

    2024年01月16日
    浏览(26)
  • python简单登录注册程序编,python登录注册程序编写

    这篇文章主要介绍了python注册用户名和密码登录,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 可以分别判断用户名称 和密码。根据输入来做各种情况的判断 用字典比用list 好些 list_user={} cmd=raw_inp

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包