python_tcp_udp


python_tcp_udp

TCP:
TCP编程的服务器端一般步骤是:

  1. 创建一个socket,用函数socket();
  2. 设置socket属性,用函数setsockopt(); * 可选
  3. 绑定IP地址. 端口等信息到socket上,用函数bind();
  4. 开启监听,用函数listen();
  5. 接收客户端上来的连接,用函数accept();
  6. 收发数据,用函数send()和recv(),或者read()和write();
  7. 关闭网络连接;
  8. 关闭监听;

TCP编程的客户端一般步骤是:

  1. 创建一个socket,用函数socket();
  2. 设置socket属性,用函数setsockopt();* 可选
  3. 绑定IP地址. 端口等信息到socket上,用函数bind();* 可选
  4. 设置要连接的对方的IP地址和端口等属性;
  5. 连接服务器,用函数connect();
  6. 收发数据,用函数send()和recv(),或者read()和write();
  7. 关闭网络连接;

UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:

  1. 创建一个socket,用函数socket();
  2. 设置socket属性,用函数setsockopt();* 可选
  3. 绑定IP地址. 端口等信息到socket上,用函数bind();
  4. 循环接收数据,用函数recvfrom();
  5. 关闭网络连接;

UDP编程的客户端一般步骤是:

  1. 创建一个socket,用函数socket();
  2. 设置socket属性,用函数setsockopt();* 可选
  3. 绑定IP地址. 端口等信息到socket上,用函数bind();* 可选
  4. 设置对方的IP地址和端口等属性;
  5. 发送数据,用函数sendto();
  6. 关闭网络连接;

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

  1. struct.pack
    struct.pack用于将Python的值根据格式符,转换为字符串,可以把这里的字符串理解为字节流.
    import struct  
    str = struct.pack("ii", a, b)  
    a= struct.pack("ii", str)  
    FormatC TypePython typeStandard sizeNotes
    xpad byteno value
    ccharstring of length 11
    bsigned charinteger1(3)
    Bunsigned charinteger1(3)
    ?_Boolbool1(1)
    hshortinteger2(3)
    Hunsigned shortinteger2(3)
    iintinteger4(3)
    Iunsigned intinteger4(3)
    llonginteger4(3)
    Lunsigned longinteger4(3)
    qlong longinteger8(2), (3)
    Qunsigned long longinteger8(2), (3)
    ffloatfloat4(4)
    ddoublefloat8(4)
    schar[]string1
    pchar[]string
    Pvoid *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格式字符串

参考:
https://www.jianshu.com/p/e8ea289b478e


本文不允许转载。
评论
  目录