tcp/udp通信

tcp/udp通信

tcp通信

服务端

import socket

soc = socket.socket()

soc.bind(('192.168.11.131',8080))
# soc.bind(('127.0.0.1',8084))

soc.listen(3)

conn, addr = soc.accept()

print(f'与{addr}连接成功')

data = conn.recv(1024)

print('有人向我发了',data.decode())

conn.send(data.upper())
print('我返回了',data.upper().decode())
conn.close()
soc.close()

客户端


import socket

soc = socket.socket()


soc.connect(('192.168.11.131',8080))
# soc.connect(('127.0.0.1',8084))
print("我发出的",'hello world')
soc.send('hello world'.encode())

data = soc.recv(1024)

print('服务端回复的:',data.decode())


soc.close()

解决tcp中的粘包问题

发数据时定制报头

import json
import struct

with open(file_path, 'rb') as f:
    data = f.read()
headers = {'data_size': len(data), 'file_name': file_name}
len(data), 'file_name': file_name}
head_json = json.dumps(headers)
head_json_bytes = bytes(head_json, encoding='utf-8')
self.request.send(struct.pack('i', len(head_json_bytes)))
self.request.send(head_json_bytes)
self.request.send(data)

收数据时先收4字节,在收报头,最后收精准的数据

import json
import struct

head = client.recv(4)
head_json_len = struct.unpack('i', head)[0]
data = client.recv(head_json_len).decode('utf-8')
head_json = json.loads(data)
file_name = head_json['file_name']
file_len = head_json['data_size']
count = 0
data_file = b''
while count < file_len:
    if file_len < 1024:
        data = client.recv(file_len)
    else:
        if file_len - count >= 1024:
            data = client.recv(1024)
        else:
            data = client.recv(file_len - count)
    data_file += data
    count += len(data)
    
# data_file 就是整个文件

udp通信

服务端

import socket

server = socket.socket(type=socket.SOCK_DGRAM)

server.bind(('127.0.0.1',8080))
while True:
    data,addr = server.recvfrom(1024)
    print(data.decode())
    server.sendto(f'我收到了{data.decode()}'.encode('utf8'),addr)

server.close()

客户端

import socket

client = socket.socket(type=socket.SOCK_DGRAM)

while True:

    client.sendto("老铁牛逼".encode('utf8'),('127.0.0.1',8080))
    data,addr = client.recvfrom(1024)
    print(data.decode())
client.close()

转载于:https://www.cnblogs.com/marklijian/p/11497642.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值