[python]python进阶编程(7)-python网络编程

说明

网络编程是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() #关闭套接字
posted @ 2020-07-04 11:19  wildkid1024  阅读(185)  评论(0编辑  收藏  举报