zoukankan      html  css  js  c++  java
  • [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() #关闭套接字
    
  • 相关阅读:
    fedora中使用 mariadb数据库建库和建表-- mariadb数据库服务无法启动?
    我在linux中使用的vundle 和 vimrc配置
    vim的加密和解密?
    gvim写html代码时如何快速地跳转到一个标签的结束位置: 终极插件: matchit.vim
    HTML5+CSS3整体回顾
    HTML5无刷新修改URL
    使用ab对nginx进行压力测试
    nginx php-fpm 输出php错误日志
    如何正确配置Nginx+PHP
    关于Nginx的一些优化(突破十万并发)
  • 原文地址:https://www.cnblogs.com/wildkid1024/p/13234271.html
Copyright © 2011-2022 走看看