pyhton socket通信(TCP和UDP通信)(一)
第一次写的时候都蒙了,为什么TCP和UDP通信是一样的函数。其实,参数不一样哦。
首先我们要知道TCP通信原理
TCP是一个面向连接的通信,通信之前必须通过3次握手建立连接。
第一次连接:客户端发消息给服务端,告诉他,我要建立连接。然后进入发送消息状态
第二次连接:服务端收到消息,回给客户端,好的,我准备好了,你来连接吧。然后进入等待消息状态
第三次连接:客户端收到消息,给服务端发送,好的,我已经知道你知道了。服务器收到ack消息之后,服务端从accept返回。然后两个一起进入连接状态。
知道了TCP通信原理,我们来看看socket封装TCP之后的流程是什么样的
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端口
上一篇: 54_分割整数
下一篇: 力扣829. 连续整数求和(数学推导)
推荐阅读
-
详解Android 基于TCP和UDP协议的Socket通信
-
使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
-
linux C ----- udp, tcp, unix socket通信简单例子
-
java网络编程_java网络编程(2)socket通信案例(TCP和UDP)
-
Java中的网络编程(UDP通信、TCP通信、Socket编程)
-
Java Socket通信及TCP/UDP总结及实例
-
Java Socket(套接字)编程、TCP和UDP通信过程详解
-
基于Linux用C语言实现TCP半双工通信和UDP半双工通信
-
Socket通信(TCP+UDP)
-
socket实现TCP/UDP通信协议设计