zoukankan      html  css  js  c++  java
  • Python—网络通信编程之tcp通信编程

    服务端代码

    import socket
    
    # 1.创建流式套接字实例
    # server = socket.socket()            
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
    
    # 2.使用bind方法绑定端口号。服务端绑定的ip和port(参数是元组)
    server.bind(("127.0.0.1", 8832))
    
    # 3.调用listen方法监听,并指定最大的连接数量。设置监听套接字,创建监听队列
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   # 设置端口重用
    server.listen(5)
    
    # 4.等待客户端链接
    while True:
        print("正在等待客户端链接...")
        conn, addr = server.accept()
        print("client connent...{0}:{1}".format(addr[0], addr[1]))
        # python3.x以上,网络数据的发送接收都是byte类型,如果发送的数据是str类型的则需要进行编码.
        conn.send(("连接成功,服务端端口:%s,客户端端口:%s" % (8832, addr[1])).encode())
    
        # 5.收发消息
        while True:
            data = conn.recv(1024)      # 接收客户端发来的消息
            # if not data or data.decode("utf-8") == "exit":
            if not data or data == b"exit":
                break
            print(data.decode())
            conn.send(("服务端返回信息:%s" % data.decode()).encode())             # 处理客户端数据
        conn.close()                    # 主动关闭连接
    	
    # 6.关闭套接字
    server.close()

    知识点1:设置端口重用:server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。

    知识点2:conn, addr = server.accept()的返回值是一个元组:返回的conn代表一个新的套接字用来和客户端通信。返回的addr是连接的客户端的地址(也是元组,包含ip与端口)。

    知识点3:发送send()函数,与接收recv()函数,操作的都是字节串。recv()函数是阻塞函数。

    客户端代码

    import socket
    
    # 1.socket实例初始化
    # client = socket.socket()         
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2.发起连接:根据服务端绑定的ip和端口,进行连接访问服务端
    client.connect(("127.0.0.1", 8832))
    
    # 3.与服务端交互,接收发送信息
    while True:      
        data = client.recv(1024)  # 接收主机信息
        print(data.decode())      # 打印接收的数据,此处的byte类型数据特指python3.x以上
        msg = input("请输入要发送的信息...")
        client.send(msg.encode())
        if not msg or msg == "exit":
            break
    	
    # 4.关闭套接字
    client.close()

    1.服务端与客户端可以一直通信,收发消息。直到客户端输入"exit",客户端退出,服务端等待下一个客户端连接。

    2.当第一个客户端与服务端一直连着的时候,第二个客户端无法与服务器连接。直到第一个客户端退出与服务器的连接,第二个客户端才能与服务器连接。

    3.当第一个客户端退出时,服务器会立马连接第二个客户端。第二个客户端之前发的信息,服务器就会收到,并返回信息。可能第二个发送端发的信息都在发送缓冲区里。

    封装服务端代码

    import socket, threading
    
    class Server():
        # 创建socket
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        # 绑定端口号
        server.bind(("127.0.0.1", 3120))
        # 调用listen()方法监听端口,并限制最大数量连接
        server.listen(5)
        
        def tcpLink(self, sock, addr):
            print('Connection from %s:%s' % addr)
            sock.send(b'Welcome...')
            while True:
                data = sock.recv(1024)
                if not data or data.decode("utf-8") == "exit":
                    break
                print(data.decode())
                sock.send(('Received data:{0}'.format(data.decode())).encode())
            sock.close()
        
        def tcpServer(self):
            while True:
                sock, addr = self.server.accept()      # 接受一个连接	
                t = threading.Thread(target=self.tcpLink, args=(sock, addr))
                t.start()
                
    if __name__ == "__main__":
        tcpserver = Server()
        tcpserver.tcpServer()

    封装客户端代码

    import socket
    
    class Client():
        # 建立一个连接,指定TCP方式
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        # 连接服务端的3120端口
        client.connect(("127.0.0.1", 3120))
        print(client.recv(1024).decode('utf-8'))
        
        def tcpClient(self):
            while True:
                msg = input("请输入要发送的信息...")
                self.client.send(msg.encode())
                if not msg or msg == "exit":
                    break
                data = self.client.recv(1024)  
                print(data.decode())
    
    if __name__ == "__main__":
        tcpclient = Client()
        tcpclient.tcpClient()

    参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408

  • 相关阅读:
    Wappalyzer(chrome网站分析插件)
    轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null
    一则sql优化实现接口耗时降低30倍的优化案例
    测试环境部署之填坑记录-Expected one result (or null) to be returned by selectOne(), but found: 2
    性能优化案例(2019-案例78)-接口性能耗时问题分析
    Unitest自动化测试基于HTMLTestRunner报告案例
    scrapy实例:爬取天气、气温等
    Python3爬取豆瓣网电影信息
    Locust压测结果准确性验证
    jd-gui反编译报错// INTERNAL ERROR //
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/12268053.html
Copyright © 2011-2022 走看看