zoukankan      html  css  js  c++  java
  • python小练习---TCP服务器端

    针对于上一篇分享
    python小练习---TCP客户端 http://www.cnblogs.com/zhaijiahui/p/6926197.html
    我继续按书中内容,向下进行
    这里需要强调一个事
    py3在使用 send() 和 recv() 的时候会出现
    TypeError: a bytes-like object is required, not 'str'
    解决方法:
    send() 里面的内容用 encode(‘utf-8’) 编码发送
    recv() 用 decode(‘utf-8’) 解码接收

    好,这个问题解决了,可以结合前面的客户端,建立一个完整的TCP通信

    # -*- coding:utf-8 -*-
    # 创建客户端,类似于浏览器发送请求
    
    import socket
    
    target_host = "127.0.0.1" # 127.0.0.1
    target_port = 9999
    
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建TCP连接
    client.connect((target_host,target_port))
    
    inputs = "zhaijh111"
    client.send(inputs.encode("utf-8"))
    response = client.recv(4096).decode("utf-8")
    
    print(response)


    下面是服务器端

    # -*- coding:utf-8 -*-
    # 接收器
    import socket
    import threading
    
    bind_ip = "0.0.0.0"
    bind_port = 9999
    size = 4096
    
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
    server.bind((bind_ip,bind_port))
    # 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。
    # 该值至少为1,大部分应用程序设为5就可以了。
    server.listen(5)
    
    print("[*] Listening on %s:%d" % (bind_ip,bind_port)) # 1
    
    def handle_client(client_socket):
    
      request = client_socket.recv(size).decode("utf-8")
      print("[*] Received: %s" % request)
    
      reply = "ACK!"
      client_socket.send(reply.encode("utf-8"))
      client_socket.close()
    
    while True:
      # print("waiting for connection...")
      client,addr = server.accept() # 2
      # 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
    
      print("[*] Accepted connection from: %s:%d" % (addr[0],addr[1]))
    
      client_handler = threading.Thread(target=handle_client,args=(client,)) # 3
      client_handler.start()

    运行结果:


    我们分析一些服务器端程序
    1、 服务器建立TCP套接字,并绑定连接,打印监听端口
    2、 服务器接收到客户端的connect 建立连接成功,打印Accepted connection
    3、 通过线程调用handle_cliet() ,接收信息,并返回一个ACK!
    注意期间发送的字符串,在py3中需要做编码,我前面提到的

  • 相关阅读:
    Mathematics:GCD & LCM Inverse(POJ 2429)
    MST:Out of Hay(POJ 2395)
    DP:Cow Exhibition(POJ 2184)(二维问题转01背包)
    《程序员修炼之道——从小工到专家》阅读笔记*part1
    Java课05
    Java课04
    Javaweb课堂测试
    Java课03
    Java课02
    回文判断
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/6939908.html
Copyright © 2011-2022 走看看