欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pyhton socket通信(TCP和UDP通信)(一)

程序员文章站 2022-07-07 15:39:28
...

第一次写的时候都蒙了,为什么TCP和UDP通信是一样的函数。其实,参数不一样哦。

首先我们要知道TCP通信原理

TCP是一个面向连接的通信,通信之前必须通过3次握手建立连接。

第一次连接:客户端发消息给服务端,告诉他,我要建立连接。然后进入发送消息状态

第二次连接:服务端收到消息,回给客户端,好的,我准备好了,你来连接吧。然后进入等待消息状态

第三次连接:客户端收到消息,给服务端发送,好的,我已经知道你知道了。服务器收到ack消息之后,服务端从accept返回。然后两个一起进入连接状态。

知道了TCP通信原理,我们来看看socket封装TCP之后的流程是什么样的

pyhton socket通信(TCP和UDP通信)(一)

pyhton socket通信(TCP和UDP通信)(一)

TCP server服务端

# -*- coding:utf-8 -*-
import socket
import sys
reload(sys)
sys.setdefaultencoding('utf8')

tcp_s_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_s_address = ('127.0.0.1',7001)
tcp_c_address = ('127.0.0.1',7002)
tcp_s_socket.bind(tcp_s_address)
tcp_s_socket.listen(2)
conn,addr = tcp_s_socket.accept()
tcp_s_data = conn.recv(1024)
print (tcp_s_data.decode())
conn.send("我收到你的消息了,我是服务端")

TCP client服务端

# -*- coding:utf-8 -*-
import socket

import sys
reload(sys)
sys.setdefaultencoding('utf8')

tcp_c_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_s_address = ('127.0.0.1',7001)
tcp_c_address = ('127.0.0.1',7002)
tcp_c_socket.bind(tcp_c_address)
tcp_c_socket.connect(tcp_s_address)
msg = "我是客户端"
tcp_c_socket.send(msg.encode('utf-8'))
receive_data = tcp_c_socket.recv(1024)
print (receive_data.decode())

可能有些小伙伴会报错”UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 36: ordinal not in range(128)“

不要慌,因为python的str默认是ascii编码,和unicode编码冲突,就会报这个标题错误

所以我上面加了代码

import sys
reload(sys)
sys.setdefaultencoding('utf8')

UDP 服务端

# -*- coding:utf-8 -*-
import socket
import sys
reload(sys)
sys.setdefaultencoding('utf8')

udp_s_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_s_address = ('127.0.0.1',7002)
udp_c_address = ('127.0.0.1',7003)
udp_s_socket.bind(udp_s_address)
udp_s_data, addr = udp_s_socket.recvfrom(1024)
print udp_s_data, addr
udp_s_socket.sendto("这是来自服务端的消息",udp_c_address)

UDP 客户端

# -*- coding:utf-8 -*-
import socket
import sys
reload(sys)
sys.setdefaultencoding('utf8')

udp_c_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_c_address = ('127.0.0.1',7003)
udp_s_address = ('127.0.0.1',7002)
udp_c_socket.bind(udp_c_address)
msg = '这是来自客户端的消息'
udp_c_socket.sendto(msg.encode('utf-8'),udp_s_address)
udp_c_data, addr = udp_c_socket.recvfrom(1024)
print udp_c_data, addr

现在知道socket通信TCP和UDP的区别了吗?

1. 初始化的时候,TCP socket初始化的参数是socket.SOCK_STREAM,

    UDP socket初始化的参数是socket.SOCK_DGRAM

2.TCP需要建立连接,所以客户端绑定自己的IP端口之后,还需要connect服务端的IP端口,

   UDP无需建立连接,只需要等待客户端来连接就行,所以,接收数据的时候可以打印Ip地址,判断这是来自哪个客户端的消息,发送数据sendto的时候,需要带客户端的IP端口