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中需要做编码,我前面提到的

原文地址:https://www.cnblogs.com/zhaijiahui/p/6939908.html