zoukankan      html  css  js  c++  java
  • UDP,TCP的套接字编程的Python实现

    UDP,TCP的套接字编程的Python实现

    套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型,并设置一些普通参数,例如缓存大小等,除此之外的所有都要运输层自己完成。

    需求:

    为了学习套接字如何操作运输层的UDP和TCP协议,此处提出一个需求:客户端接收用户输入的信息,并发送到服务器上,并接收由服务器把所有字母大写之后的数据,再显示出来。
    整个过程需要以下步骤:
    1.客户端提示用户信息输入并将数据发送给服务器
    2.服务器接收信息,把字幕转换为大写
    3.服务器将修改好的数据再次发送给客户端
    4.客户端接收到服务器发送来的数据,并将其显示出来

    UDP套接字编程

    必须要先运行服务器端程序,保证服务器是处于运行状态的,客户端才能跟服务器进行通信。

    UDP不需要先经过三次握手确保建立了连接,所以要在每个要传输的报文上携带目的地址

    客户端代码:

    # -*- coding:utf-8 -*-
    from socket import *
    
    #设置服务器主机名或者IP地址
    serverName = '127.0.0.1'
    #设置主机的接收进程,即端口号
    serverPort = 12000
    #创建客户端套接字,AF_INET指示底层用IPv4, SOCK_DGRAM指定是UDP套接字不是TCP套接字
    clientSocket = socket(AF_INET,SOCK_DGRAM)
    #客户端提示用户输入信息
    message = raw_input("Input lowercase sentence:")
    #发送报文到目的地
    #sendto()方法为报文附上目的地址,并且向进程的套接字clientSocket发送结果分组
    clientSocket.sendto(message, (serverName, serverPort))
    #当有数据到达客户端的套接字时,使用recvfrom()方法接收,指定缓存长度为2048
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
    #打印刚刚接收到的信息
    print modifiedMessage, serverAddress
    #关闭套接字
    clientSocket.close()
    
    
    

    服务器端代码:

    # -*- coding:utf-8 -*-
    from socket import *
    
    #定义一个端口号
    serverPort = 12000
    #实例化一个服务器端的套接字,AF_INET指定使用IPv4,SOCK_DGRAM指定使用UDP
    serverSocket = socket(AF_INET, SOCK_DGRAM)
    #为服务器端套接字绑定一个端口
    serverSocket.bind(('', serverPort))
    print "The server is ready to receive"
    #处于循环监听状态
    while True:
        #当有数据到达本地的12000端口的套接字处时,使用recvfrom()接收
        message, clientAddress = serverSocket.recvfrom(2048)
        #对接收到的数据进行处理
        modifiedMessage = message.upper()
        #使用sendto()发送数据到客户端
        serverSocket.sendto(modifiedMessage, clientAddress)
    
    

    TCP套接字编程

    同样,先运行服务器端的程序

    TCP需要先经过三次握手在客户端和服务器之间连接连接,然后再传输数据,所以,在建立连接时需要指定目的地址,而在传输数据时就不需要再附带目的地址数据了。
    需要注意的是:服务器监听所有客户端发来的连接请求,如果发现有请求,就为其建立一个新的连接来传输数据。

    客户端程序:

    # -*- coding:utf-8 -*-
    
    from socket import *
    
    #服务器端的IP地址或名称和端口号
    serverName = '127.0.0.1'
    serverPort = 12000
    #实例化套接字,SOCK_STREAM指定使用的是TCP协议
    clientSocket = socket(AF_INET, SOCK_STREAM)
    #客户端和服务器端建立连接
    clientSocket.connect((serverName, serverPort))
    #提示用户输入信息
    sentence = raw_input("Input lowercase sentence:")
    #客户端发送数据到服务器,此处不同于UDP
    #此处没有为数据指定地址,是因为已经和服务器建立和连接,可以直接通信了
    clientSocket.send(sentence)
    #接收返回的数据
    modifiedSentence = clientSocket.recv(1024)
    #打印显示服务器端发回来的数据
    print 'From Server:', modifiedSentence
    #关闭客户端套接字连接
    clientSocket.close()
    

    服务器端程序:

    # -*- coding:utf-8 -*-
    
    from socket import *
    #定义端口号变量
    serverPort = 12000
    #实例化服务端套接字,SOCK_STREAM指定使用TCP协议
    serverSocket = socket(AF_INET, SOCK_STREAM)
    #为套接字绑定端口号
    serverSocket.bind(('', serverPort))
    #监听来自客户端的请求,其中参数定义了最大连接数
    serverSocket.listen(1)
    print 'The server is ready to receive'
    #循环监听
    while 1:
        #服务器监听到来自客户端的请求,使用accept()为其创建一个新的专用的连接。
        #此处不同与UDP,TCP在经过公用的三次握手之后,为其建立一个新连接供其传输数据
        connectionSocket, addr = serverSocket.accept()
        #接收客户端发送来的数据
        sentence = connectionSocket.recv(1024)
        #操作接收到的数据
        capitalizedSentence = sentence.upper()
        #发送数据到客户端
        connectionSocket.send(capitalizedSentence)
        #断开连接
        connectionSocket.close()
    
  • 相关阅读:
    使用AChartEngine画图,项目总结
    Windows系统安装实验报告
    Linux系统安装实验报告
    vm虚拟机详细安装步骤
    L3-010. 是否完全二叉搜索树
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛
    L2-021. 点赞狂魔
    L2-020. 功夫传人
    L2-019. 悄悄关注
    L2-017. 人以群分
  • 原文地址:https://www.cnblogs.com/cenyu/p/6751658.html
Copyright © 2011-2022 走看看