[Python-12] Programación de red-Modelo TCP

Servidor

# 单任务,单任务代码一次仅能接收一个客户端的请求
# ----------------------------------------
import socket 

# socket.AF_INET (IPV4)
# socket.SOCK_STREAM (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 监听 IP:port
host_name = socket.gethostname()
host = socket.gethostbyname(host_name)
print(host)
s.bind((host, 8008))

# 最大允许连接数量
s.listen(3)

# 死循环,重复的处理着每个客户端的请求
while True:

    # 阻塞 每当有客户端的请求过来开始执行
    # 连接处理 (已完成三次握手)并获取资源对象 | conn 请求对象 | addr 客户端地址 ip: port
    conn, addr = s.accept() 

    # 请求处理 | 读取客户端发送过来的数据 | recv(1024) 指定每次读取 1024 字节,当数据较长时可以通过 while 循环读取
    data = conn.recv(1024).decode('utf-8')

    print(data)
    # 响应处理 | 把客服端发送过来的数据又转发回去
    conn.sendall(data.encode('utf-8'))

    # 关闭客户端连接
    conn.close()

# 多线程
# -----------------------------------------------
import socket 
import threading

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host_name = socket.gethostname()
host = socket.gethostbyname(host_name)
print(host)
s.bind((host, 8008))
s.listen(3)

# 处理函数
def link(conn, addr):
 data = conn.recv(1024).decode('utf-8')
 conn.sendall(data.encode('utf-8'))
 conn.close()

while True:
    conn, addr = s.accept()

    # 每次新开一个线程,处理客户端的请求
    t = threading.Thread(target=link, args=(conn, addr))
    t.start()


Cliente

import socket 

host_name = socket.gethostname()
host = socket.gethostbyname(host_name)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端
s.connect((host, 8008))

# 请求 | 发送数据到服务端
s.sendall(b'hello')

# 响应 | 接受服务端返回到数据
data = s.recv(1024)

print(data) # hello

# 关闭 socket
s.close()
134 artículos originales publicados · Me gustaron 119 · Visite 310,000+

Supongo que te gusta

Origin blog.csdn.net/jobbofhe/article/details/90407040
Recomendado
Clasificación