python socket发送TCP数据方式
作者:MXG_ZZU
python socket发送TCP数据
用python写socket发送 TCP的数据
import socket import time
#客户端发送500个包 创建socket、连接、发送、关闭
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #绑定端口,发送数据时会从绑定的端口发送,不会再生成随机端口 #tcp_socket.bind(("*.*.*.*", 8001)) tcp_socket.connect(("127.0.0.1", 8000)) n = 0 while(n<500): send_data = str(n) tcp_socket.send(send_data.encode("utf-8")) time.sleep() n=n+1 tcp_socket.close()
#接收端接收500个包 创建socket、绑定端口、监听端口、接收连接请求、接收数据、关闭
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.bind(("192.168.1.128(本机私网IP)", 8000)) tcp_socket.listen() client_scoket,client_addr = tcp_socket.accept() timestamps = [] n = 0 while(n<500): recv_data = client_scoket.recv(1024) print(recv_data.decode('utf-8')) timestamps.append(time.perf_counter()) # 记录时间戳 n = n+1 client_scoket.close() tcp_socket.close()
Python Socket(TCP和UDP)
IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割为一块一块,然后通过IP包发送出去,IP包的特点是按块发送,途径多个路由,但是不保证可以到达,也不保证顺序到达。
TCP协议建立在IP协议之上,负责在两台计算机之间建立可靠连接,保证数据包顺序到达,建立连接,对每个IP包编号,确保顺序收到,如果包丢了,就自动重发。
TCP(比较可靠的传输)
TCP连接是可靠连接,如果传输比较重要,确保对方收到,可以用TCP。建立TCP连接时,主动发起连接的是客户端(client),而被动响应连接的是服务器(server)。
下边例子实现:客户端向服务端发送数据,服务端接收此数据,进行计算,将该结果返回客户端。
服务端
利用docker容器运行服务端
起容器时应该将容器的12312端口(该端口号为服务端程序中暴露的端口号)映射到主机的端口
使用镜像test:v1启动一个容器,在容器内执行/bin/bash命令,将容器的12312端口映射到主机的12312端口,主机的目录/data映射到容器的/data
docker run -it -p 12312:12312 -v /test:/test test:v1 /bin/bash
程序如下:
import socketimport numpy as npimport time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)host = '0.0.0.0' # ip地址port = 12313 # 端口号s.bind((host, port))s.listen(5)print('Waiting for connection...')sock, addr = s.accept()print('Connection successful:', addr)sock.send(b'Send data please')while True: client_data = sock.recv(400000) time.sleep(1) if not client_data: break get_data = np.fromstring(client_data, np.float32) get_data = np.array(get_data).reshape(1,2,3,4) print(get_data) result = get_data cilent_result = result.tostring() sock.send(cilent_result)sock.close()print('Connection closed!')
上述程序是进行一次传输之后自动结束运行,如果服务端可循环接收数据,可手动控制停止,可用下述方法。
import socket import numpy as np import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = '0.0.0.0' # ip地址 port = 12313 # 端口号 s.bind((host, port)) s.listen(5) print('Waiting for connection...') sock, addr = s.accept() print('Connection successful:', addr) sock.send(b'Send data please') while True: client_data = sock.recv(400000) time.sleep(1) if not client_data: break get_data = np.fromstring(client_data, np.float32) get_data = np.array(get_data).reshape(1,2,3,4) print(get_data) result = get_data cilent_result = result.tostring() sock.send(cilent_result) sock.close() print('Connection closed!')
客户端
客户端容器不用指定端口,正常起容器
程序如下:
import socket import numpy as np data = np.ones((1,2, 3, 4),np.float32) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('123.123.0.1', 12313)) # 服务端IP地址, 该地址为服务端的IP地址 print(s.recv(1024).decode('utf-8')) # 端口号,与服务端暴露的端口号一致 client_data = data.tostring() s.send(client_data) serve_result = s.recv(40000) result = np.fromstring(serve_result, np.float32) result = np.array(result).reshape(1,2,3,4) print(result) s.close()
UDP(不要求可靠到达传输)
UDP传输不需要建立连接,只需要知道对方的IP地址和端口号即可发送。但是对方能不能收到就不确定了。
当进行一个不要求可靠到达的数据传输,就可以使用UDP协议,该传输方式不可靠但是速度比较快。
以下程序UDP实现:服务端收到客户端的信息,进行计算,将结果返回客户端。客户端退出,而服务端需要手动退出。(下述程序需在同一主机上用两个终端运行)
服务端
程序如下:
import socket import numpy as np import time s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) host = '127.0.0.1' port = 9999 s.bind((host, port)) while True: data, addr = s.recvfrom(4000) if not data: break get_data = np.fromstring(data, np.float32) get_data = np.array(get_data).reshape(1,2,3,4) print(get_data) result = get_data client_result = result.tostring() s.sendto(client_result, addr)
客户端
import socket import numpy as np s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) host = '127.0.0.1' port = 9999 data = np.ones((1,2, 3, 4),np.float32) client_data = data.tostring() s.sendto(client_data, (host, port)) serve_result, addr = s.recvfrom(40000) result = np.fromstring(serve_result, np.float32) result = np.array(result).reshape(1,2,3,4) print(result) s.close()
注:IP地址设置为0.0.0.0,并不是一个真实的IP地址,表示本地中所有的IPV4地址,监听0.0.0.0的端口,就是监听本机中所有的IP端口
IP地址设置为127.0.0.1,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,外部的计算机无法连接进来。一般会通过ping 127.0.0.1来测试某台机器上的网络设备是否正常。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。