网络通信篇下(TCP实战开发)聊天器的开发两台电脑实现联通--socket模块的应用开发技术

博客详细介绍了如何使用Python实现TCP服务器,包括创建套接字、绑定IP和端口、监听连接、接受客户端连接并进行数据收发。通过循环结构优化代码,使得服务器能够为多个客户端提供连续服务,同时处理客户端断开连接的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP服务端(服务器)

如果想执行tcp服务器的功能,需要执行以下流程

  1. socket创建一个套接字
  2. bind方法绑定IP和port
  3. listen使套接字变为可被动链接
  4. accept等待可无端的链接(必须创建一个新的监听套接字和重定义一个新的接收器)
  5. recv/send接收发送数据

对于accept必须要接收两个 一个是定义新的套接字,另一个是监听的函数。对其进行监听

import socket
def main():
    #1.买个手机(创建套接字 socket)
    #这个套接字用来初始化响应,最终需要最后新定义的套接字进行真正的实现通信
    tcp_server_scoket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #2.插入手机卡(绑定本地信息 bind)
    tcp_server_scoket.bind(("",7890))
    #3.将手机设为正常的响铃模式(让默认的套接字有主动变为被动 listen)
    tcp_server_scoket.listen(128)
    print("------1----------")
    #4.等待别人电话到来(等待客户端的链接 accpet)
    #重定义新的套接字和新的绑定IP和端口
    new_client_socket,client_addr =tcp_server_scoket.accept()
    print("--------2--------")
    print(client_addr)
    #接收客户端发过来的请求
    recv_data =new_client_socket.recv(1024)
    print(recv_data)
    #会送一部分数据给客户端
    new_client_socket.send("hhhhhhh".encode("utf-8"))
    new_client_socket.close()
    tcp_server_scoket.close()

if __name__ == '__main__':
    main()

总结,前文与udp接收消息还是有很大区别的,比如,TCP信号传递需要用到新的套接字,后面要重新定义一下。端口绑定和udp相同,在前面一定要做的。通过新的套接字和监听的IP及端口调用的accept函数在服务端没有接收到客户端的信息发送的时候会出现拥堵的情况,没有接收到客户端传来的信息这样会导致程序无法继续向前执行,一旦有人发送信息被客户端接收了,那么客户端就继续执行结束,这样就导致程序直接接收到一个用户的信息,而且只能接收一次,这样就会存在这弊端,为了解决这个弊端我们要重新优化一下代码。使tcp服务端循环为多名客户服务

TCP服务端循环为多个客户端服务

import socket
def main():
    #1.买个手机(创建套接字 socket)
    #这个套接字用来初始化响应,最终需要最后新定义的套接字进行真正的实现通信
    tcp_server_scoket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #2.插入手机卡(绑定本地信息 bind)
    tcp_server_scoket.bind(("",7890))
    #3.将手机设为正常的响铃模式(让默认的套接字有主动变为被动 listen)
    tcp_server_scoket.listen(128)
    #这个while True:循环为多个客户端服务
    while True:
        print("等待一个新的客户端的到来....")
        #4.等待别人电话到来(等待客户端的链接 accpet)
        new_client_socket,client_addr =tcp_server_scoket.accept()
        print("一个客户端已经到来")
        print("一个新的客户端已经到来%s"%str(client_addr))
        #接收客户端发过来的请求
        #这个 while True循环多次为同一个客户端服务多次
        while True:
            recv_data =new_client_socket.recv(1024)
            print("客户端发送过来的请求是%s"%recv_data.decode("utf-8"))
            #会送一部分数据给客户端
            new_client_socket.send("hhhhhhh".encode("utf-8"))
            new_client_socket.close()
        print("服务完成")
        #如果将监听套接字关闭,那么就导致无法等待新的客户端到来 即 xxxx.accept就会失败
    tcp_server_scoket.close()

if __name__ == '__main__':
    main()

继续优化,再来一口美味的汤

import socket
def main():
    #1.买个手机(创建套接字 socket)
    #这个套接字用来初始化响应,最终需要最后新定义的套接字进行真正的实现通信
    tcp_server_scoket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #2.插入手机卡(绑定本地信息 bind)
    tcp_server_scoket.bind(("",7890))
    #3.将手机设为正常的响铃模式(让默认的套接字有主动变为被动 listen)
    tcp_server_scoket.listen(128)
    #这个while True:循环为多个客户端服务
    while True:
        print("等待一个新的客户端的到来....")
        #4.等待别人电话到来(等待客户端的链接 accpet)
        new_client_socket,client_addr =tcp_server_scoket.accept()
        print("一个客户端已经到来")
        print("一个新的客户端已经到来%s"%str(client_addr))
        #接收客户端发过来的请求
        #这个 while True循环多次为同一个客户端服务多次
        while True:
            recv_data =new_client_socket.recv(1024)
            print("客户端发送过来的请求是%s"%recv_data.decode("utf-8"))
            #会送一部分数据给客户端
            #如果recv解堵塞,那么有两种方式
            #1.客户端发送过来数据 2. 客户端调用close导致这里recv解堵塞
            if recv_data:
                #会送一部分数据给客户端
                new_client_socket.send("hhhhhhh".encode("utf-8"))
            else:
                break

            new_client_socket.close()
        print("服务完成")
        #如果将监听套接字关闭,那么就导致无法等待新的客户端到来 即 xxxx.accept就会失败
    tcp_server_scoket.close()

if __name__ == '__main__':
    main()

总体来说,与udp相似,需要注意几个点,TCP服务是需要两个端联动的,一个是客户端,一个是服务端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学成七步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值