说明
网络编程是python中重要的一部分,今天我们来讨论一下python的tcp和udp连接的创建。
其中tcp和udp的区别在于,tcp的连接是有状态的,而udp是无状态的。
udp套接字
udp的客户端发送时需要指定的ip和端口,而服务端则需要绑定对应的ip和接口,以下示例程序展示了使用了两个线程并行完成了数据的发送和接受。
from socket import * #导入socket
from threading import * #导入threading
udp = socket(AF_INET, SOCK_DGRAM) #创建套接字,基于UDP传输协议。相对于TCP比较快。AF_INET表示使用IPV4进行链接。如果使用IPV6则把参数修改为AF_INET6
udp.bind(('',9000)) #绑定任意ip和端口,如果不进行绑定,那么每创建一个套解字就会使用一个动态端口。
sendip = input('输入接收方的IP:')
sendport = int(input('输入接收方的端口:'))
def sendinfo():
while True:
senddata = input('请输入发送的内容:')
udp.sendto(senddata.encode('utf-8'),(sendip,sendport)) #调用套解字的sendto方法,第一个参数为编码后的数据,第二个参数为接收方的IP和端口。
def receiveinfo():
while True:
recvdata = udp.recvfrom(1024) #调用recvfrom方法进行数据接收,并且以元祖的方式返回,第一个参数是数据,第二个参数为IP和端口。与发送格式一致。
print(recvdata[1],recvdata[0].decode('utf-8')) #将接收到的数据进行打印,并将数据进行解码。
def main():
ts = Thread(target=sendinfo) #创建一个线程运行发送函数。
tr = Thread(target=receiveinfo) #创建一个线程运行接收函数。
ts.start()
tr.start()
ts.join()
tr.join()
if __name__ == '__main__':
main()
tcp套接字
tcp服务器:与udp服务器不同的是,前期的创建套接字绑定端口和udp的方式基本一致,后续的差别在于需要listen客户端的请求,并通过accept得到一个连接。其实现代码如下所示:
from socket import *
tcp = socket(AF_INET,SOCK_STREAM) #创建tcp套接字
tcp.bind(('',9000)) #绑定ip,和端口,客户端需要连接这个ip和端口进行服务器连接。
tcp.listen(5) #tcp监听,参数为可连接的数量。
newsocket, addr = tcp.accept() #接收客户端的连接,并返回一个新的socket和客户端地址。阻塞程序等待客户端的接入。
while True:
socketDate = newsocket.recv(1024) #接收客户端的数据。
if len(socketDate)>0: #如果接收数据的长度大于0,则打印出接收到的信息,如果接收的数据长度为0,则表示客户端使用close方法关闭了套接字。
print(socketDate.decode('utf-8'))
else:
break
sendDate = input('请输入要回复的内容:')
newsocket.send(sendDate.encode('utf-8'))
newsocket.close() #关闭与客户端通信的套接字。
tcp.close() #关闭服务器的套接字,关闭后将不会再接收客户端的连接。
tcp客户端:客户端的实现多了一步通过connect建立连接的过程,其他的实现过程与udp基本类似,示例代码如下:
from socket import * #导入模块
csocket = socket(AF_INET,SOCK_STREAM) #创建套接字
serverIp = input('请输入服务器的IP:')
csocket.connect((serverIp,9000)) #连接服务器
while True:
sendData = input('请输入需要发送打内容:') #输入发送的内容
csocket.send(sendData.encode('utf-8')) #编码发送
recvData = csocket.recv(1024)
print('recvData:%s'%recvData.decode('utf-8')) #解码输出
csocket.close() #关闭套接字