首页 > 编程语言 >多任务版TCP服务端程序开发

多任务版TCP服务端程序开发

时间:2023-08-12 19:44:54浏览次数:34  
标签:__ socket ip 程序开发 TCP server client 服务端 客户端

分析

当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞

 

示例

服务端

 1 import socket
 2 import threading
 3 
 4 
 5 # 处理客户端函数
 6 def handle_client(conn_socket, ip_port):
 7     try:
 8         while True:
 9             # 5.接收数据
10             recv_data = conn_socket.recv(1024)
11             if not recv_data:  # 一般是客户端主动端口或网络问题导致自动端口
12                 break
13             else:
14                 print("接收到的数据:", recv_data.decode('utf-8'))
15                 # 6.发送数据
16                 conn_socket.send("客户端你的数据我收到了".encode())
17     except socket.error as e:
18         print("处理客户端数据发生异常,异常信息:{}", e)
19     finally:
20         if conn_socket is not None:
21             print("关闭客户端:", ip_port)
22             conn_socket.close()  # 7.关闭套接字
23 
24 
25 # 1 使用循环接收客户端的连接请求
26 if __name__ == '__main__':
27     # 1.创建服务端套接字对象
28     tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
29     # 设置端口复用即设置套接字的SO_REUSEADDR选项为True。
30     # 当设置SO_REUSEADDR选项为True时,表示允许在同一端口上重用本地地址。具体来说,它允许一个套接字对象再次绑定到一个已经处于TIME_WAIT状态的本地地址和端口,通常用于解决"Address already in use"错误。
31     tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
32     # 2. 绑定指定的IP地址和端口号
33     # tcp_server_socket.bind(("172.16.62.136", 8888))
34     # 如果bind中的参数第一个ip地址元素设置为"",默认为本机ip地址即所有本地上的所有IP
35     tcp_server_socket.bind(("", 8080))
36     # 3.设置监听 128:代表服务端等待排队连接的最大数量
37     tcp_server_socket.listen(128)
38 
39     while True:
40         # 4.等待接受客户端的连接请求 accept阻塞等待 返回一个用以和客户端通socket,客户端的地址
41         conn_socket, ip_port = tcp_server_socket.accept()
42         print("客户端地址:", ip_port)
43         print("ip_port的类型:", type(ip_port))
44 
45         # 使用多线程去接收多个客户端的请求
46         sub_thread = threading.Thread(target=handle_client, args=(conn_socket, ip_port))
47         sub_thread.start()
48 
49     tcp_server_socket.close()

 

客户端

 1 '''
 2 在使用Socket客户端时,还需要考虑以下几点最佳实践:
 3     1. 使用异常处理:Socket操作可能会抛出异常,例如连接错误或数据传输错误。因此,在使用Socket客户端时,应该使用适当的异常处理来捕获和处理这些异常。
 4     2. 关闭连接:在不再使用Socket连接时,应该及时关闭连接,以释放系统资源。
 5     3. 数据编码:在发送和接收数据时,需要将数据进行编码和解码,通常可以使用encode()和decode()方法将字符串转换为字节流和字节流转换为字符串。
 6     4. 错误处理:尽管Socket提供了可靠的网络通信,但仍然可能发生错误,例如连接超时或服务器无响应。在使用Socket客户端时,应该考虑这些错误情况,并采取相应的错误处理措施。
 7 '''
 8 
 9 import socket
10 
11 
12 def send_request(client_socket, request):
13     client_socket.sendall(request.encode('utf-8'))
14     response = client_socket.recv(1024).decode('utf-8')
15     return response
16 
17 
18 def main():
19     client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
20     server_address = ('localhost', 8080)
21     client_socket.connect(server_address)
22 
23     try:
24         while True:
25             request = input('Enter a request (q to quit): ')
26             if request == 'q':
27                 break
28             response = send_request(client_socket, request)
29             print('Response:', response)
30     finally:
31         client_socket.close()
32 
33 
34 if __name__ == '__main__':
35     main()

通过netstat命令查看端口状况:

 

标签:__,socket,ip,程序开发,TCP,server,client,服务端,客户端
From: https://www.cnblogs.com/allenxx/p/17625347.html

相关文章

  • TCP客户端开发
    什么是客户端&服务端?1.TCP网络应用程序开发分为客户端程序开发和服务端程序开发。2.主动发起建立连接请求的是客户端程序3.等待接受连接请求的是服务端程序 TCP客户端开发流程 TCP客户端与服务端启动、交换过程:TCP客户端开发步骤:1.创建客户端套接字对象(买电话)......
  • CCLINK转MODBUS-TCP网关cclink模块接线图
    大家好,今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议,它们的不同使得数据互通比较困难,但捷米JM-CCLK-TCP网关的出现改变了这一切。1捷米JM-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关,它的主要功能是将各种MODBUS-TCP设备接入到CCLINK总线中。网关连接到CCLINK......
  • 优秀的 Modbus 从站(从机、服务端)仿真器、串口调试工具
    主要功能支持多种Modbus协议,包括:ModbusRTUModbusASCIIModbusTCP/IPModbusUDP/IPModbusRTUOverTCP/IPModbusRTUOverUDP/IP监视串行线路或以太网上的通信数据支持多达28种数据格式,包括:Signed、Unsigned、Hex、Binary、Long、Float、Double等支持Modbus协议地址和PLC......
  • 优秀的 Modbus 从站(从机、服务端)仿真器、串口调试工具
    目录优秀的Modbus从站(从机、服务端)仿真器、串口调试工具主要功能软件截图优秀的Modbus从站(从机、服务端)仿真器、串口调试工具官网下载地址:http://www.redisant.cn/mse主要功能支持多种Modbus协议,包括:ModbusRTUModbusASCIIModbusTCP/IPModbusUDP/IPModbusRTUO......
  • TCP三次握手与四次挥手状态变化十一种状态变化详解
    建立连接过程:客户端默认状态:CLOSED:关闭发起建立连接状态:SYN_SENT 发送SYN建立连接状态:ESTABLISHED已连接服务端服务端默认状态为LISTEN接受SYN并发送ACK:SYN_RCVD我接受到了你的SYN请求ESTABLISHED 建立连接断开连接过程客户端:连接状态:ESTABLISHED客户端发送FIN断开连接客户......
  • TCP三次握手与四次挥手详解
    三次握手根据TCP的包头字段,存在三个重要的标识ACKSYNFINACK:位置为1,表示确认收到发送请求,表示确认位SYN:位置1,表示建立TCP连接FIN:位置1,表示断开TCP连接PC1要与PC2建立TCP连接三次握手1)首先PC1像PC2发送:SYN包(表示我要与你建立连接)2)PC2收到后回复PC1:ACK(同意与你建立连接),并发送:SYN(......
  • 传奇服务端架设-简单传送脚本
    [@main]从苍月岛走海路,从魔龙城爬高原,都试过了,行不通啊!\看样子,战胜火龙从正面翻越雪山,是回家的唯一途径了!\年轻人,回家就靠你们了。想要强大就得不断挑战!\<想去商店/@想去商店>\[@想去商店]你想到哪个商店?这可是免费体验服务啊!\<服装店/@Gpo>\<武器店/@Gwe>\<首饰店/@Gza>\<退出/@ex......
  • 微信小程序开发_入门案例_3
       ......
  • 微信小程序开发_入门案例_4
       记得开启项目和Redis  ......
  • 微信小程序开发_入门案例_2
        ......