zoukankan      html  css  js  c++  java
  • 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验。

    流程如下:

    1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器。

    2.服务器从其连接套接字读取一行字符。

    3.服务器将该行字符转换成大写。

    4.服务器将修改后的字符串(行)通过连接套接字再发回给客户机。

    5.客户机从其套接字中读取修改后的行,然后将该行在其标准输出(监视器)上打印出来。

    【TCP】服务器端代码:

    import socket
    import time
    import threading
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #创建socket (AF_INET:IPv4, AF_INET6:IPv6) (SOCK_STREAM:面向流的TCP协议)
    
    s.bind(('127.0.0.1', 10021))                           #绑定本机IP和任意端口(>1024)
    
    s.listen(1)                                            #监听,等待连接的最大数目为1
    
    print('Server is running...')                          
                                   
    def TCP(sock, addr):                                   #TCP服务器端处理逻辑
        
        print('Accept new connection from %s:%s.' %addr)   #接受新的连接请求
    
        while True:
            data = sock.recv(1024)                         #接受其数据
            time.sleep(1)                                  #延迟
            if not data or data.decode() == 'quit':        #如果数据为空或者'quit',则退出
                break
            sock.send(data.decode('utf-8').upper().encode())  #发送变成大写后的数据,需先解码,再按utf-8编码,  encode()其实就是encode('utf-8')
    
        sock.close()                                       #关闭连接
        print('Connection from %s:%s closed.' %addr)       
    
    while True:
        
        sock, addr = s.accept()                            #接收一个新连接
        TCP(sock, addr)                                    #处理连接

    【TCP】客户端代码:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建一个socket
    
    s.connect(('127.0.0.1', 10021))                       #建立连接
    
    while True:                                           #接受多次数据
    
        data = input('请输入要发送的数据:')                 #接收数据
    
        if data == 'quit':                                #如果为'quit',则退出
            break
    
        s.send(data.encode())                             #发送编码后的数据
    
        print(s.recv(1024).decode('utf-8'))               #打印接收到的大写数据
    
    s.send(b'quit')                                       #放弃连接
    
    s.close()                                             #关闭socket

    运行结果:

    UDP协议则不需要事先建立连接,直接互相发送数据即可。

    【UDP】服务器端代码:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建一个socket,SOCK_DGRAM表示UDP
    
    s.bind(('127.0.0.1', 10021))                         #绑定IP地址及端口
    
    print('Bound UDP on 10021...')
    
    while True:                                          
        data, addr = s.recvfrom(1024)   #获得数据和客户端的地址与端口,一次最大接收1024字节
        print('Received from %s:%s.' % addr)
        s.sendto(data.decode('utf-8').upper().encode(), addr)#将数据变成大写送回客户端
    
    #不关闭socket

    【UDP】客户端代码:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     
    addr = ('127.0.0.1', 10021)       #服务器端地址
    
    while True:
        data = input('请输入要处理的数据:') #获得数据
        if not data or data == 'quit':
            break
        s.sendto(data.encode(), addr)    #发送到服务端
        recvdata, addr = s.recvfrom(1024)  #接收服务器端发来的数据
        print(recvdata.decode('utf-8'))    #解码打印
    
    s.close()            #关闭socket

    运行结果:

  • 相关阅读:
    codeforces 189A
    hdu 2085
    hdu 2083
    cf 1237 C2. Balanced Removals (Harder)
    cf 1244 D. Paint the Tree
    cf 1241 E. Paint the Tree(DP)
    cf 1241 D. Sequence Sorting(思维)
    cf1228 D Complete Tripartite(哈希)
    Windows10 与 WSL(Ubuntu)的文件互访
    Ubuntu下运行python文件
  • 原文地址:https://www.cnblogs.com/whatbeg/p/5155524.html
Copyright © 2011-2022 走看看