python_tcp_udp
TCP:
TCP编程的服务器端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt(); * 可选
- 绑定IP地址. 端口等信息到socket上,用函数bind();
- 开启监听,用函数listen();
- 接收客户端上来的连接,用函数accept();
- 收发数据,用函数send()和recv(),或者read()和write();
- 关闭网络连接;
- 关闭监听;
TCP编程的客户端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt();* 可选
- 绑定IP地址. 端口等信息到socket上,用函数bind();* 可选
- 设置要连接的对方的IP地址和端口等属性;
- 连接服务器,用函数connect();
- 收发数据,用函数send()和recv(),或者read()和write();
- 关闭网络连接;
UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt();* 可选
- 绑定IP地址. 端口等信息到socket上,用函数bind();
- 循环接收数据,用函数recvfrom();
- 关闭网络连接;
UDP编程的客户端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt();* 可选
- 绑定IP地址. 端口等信息到socket上,用函数bind();* 可选
- 设置对方的IP地址和端口等属性;
- 发送数据,用函数sendto();
- 关闭网络连接;
TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
UDP
客户端
def mythread(sock, data, addr):
sock.sendto(data, addr)
UDPADD= (host1,port)
MULTICAST_TTL = 2
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL)
t = threading.Thread(target=mythread, args=(sock, string1, (UDPADD)))
服务端
class PictureUDP:
def __init__(self, UDPADD):
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.s.settimeout(0.1)
self.s.bind(UDPADD)
def UDPADDsend(self,str):
self.s.send(str)
def UDPADDrecv(self):
try:
self.s.settimeout(0.08)
data, addr = self.s.recvfrom(60000)
# print("%s 在 %s发来数据 :%s " % (data, time.ctime(), data))
timeout=0
except socket.timeout:
data="timeout"
addr=123
return data,addr,timeout
TCP
客户端
HOST ='localhost'
PORT = 12345
BUFFSIZE=2048
ADDR = (HOST,PORT)
tctimeClient = socket(AF_INET,SOCK_STREAM)
tctimeClient.connect(ADDR)
#发送
tctimeClient.send("发送内容".encode)
reciverdata=tctimeClient.recv(bufsize).decode()
服务端
host = ''
port = 12345
buffsize = 8000
ADDR = (host,port)
from socket import *
tctime = socket(AF_INET,SOCK_STREAM)
tctime.bind(ADDR)
tctime.listen(3)
print('Wait for connection ...')
tctimeClient,addr = tctime.accept()
print("Connection from :",addr)
while True:
data = tctimeClient.recv(buffsize).decode()
tctimeClient.send("发送内容".encode())
数据转换
数据转换为可以传输的bytes格式
encode
str.encode() str.decode()
这个主要用于对于string类型数据转为bytes类型数据。
pickle
- pickle.dumps()将对象obj对象序列化并返回一个byte对象
- pickle.loads(),从字节对象中读取被封装的对象
import pickle
dict1 = dict(name='man',
age=1)
data_dumps = pickle.dumps(dict1)
data=pickle.loads(data_dumps )
其可以传输字典类型,然后收到以后也是以字典形式存在。
struck
- struct.pack
struct.pack用于将Python的值根据格式符,转换为字符串,可以把这里的字符串理解为字节流.import struct str = struct.pack("ii", a, b) a= struct.pack("ii", str)
Format C Type Python type Standard size Notes x pad byte no value c char string of length 1 1 b signed char integer 1 (3) B unsigned char integer 1 (3) ? _Bool bool 1 (1) h short integer 2 (3) H unsigned short integer 2 (3) i int integer 4 (3) I unsigned int integer 4 (3) l long integer 4 (3) L unsigned long integer 4 (3) q long long integer 8 (2), (3) Q unsigned long long integer 8 (2), (3) f float float 4 (4) d double float 8 (4) s char[] string 1 p char[] string P void * integer (5), (3)
io
send_bytes = io.BytesIO()
xxx.save(send_bytes, format='jpeg')
send_buf = send_bytes.getvalue()
recv_bytes = io.BytesIO(xxx)
xxx = Image.open(recv_bytes)
可以将图片转换为jpg格式字符串