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中需要做编码,我前面提到的
知识要大家一起分享,但带上原文链接是对作者的尊重。