Tcp客户端
import socket
# ip协议版本 AF_INET ipv4
# 选择协议 SOCK_STREAM tcp协议
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_client_socket.connect(("127.0.0.1", 9090))
# 转二进制
send_data = '123'.encode("utf8")
tcp_client_socket.send(send_data)
recv_data = tcp_client_socket.recv(1024)
recv_msg = recv_data.decode("utf8")
print(recv_msg)
tcp_client_socket.close()
Tcp服务端
import multiprocessing
import socket
def handler_client_request(client_socket):
while True:
recv_data = client_socket.recv(1024)
# 客户端断开链接
if len(recv_data) == 0:
print("客户端关闭!!!")
break;
recv_mes = recv_data.decode("utf8")
print("收到信息", recv_mes)
send_data = "server".encode("utf8")
client_socket.send(send_data)
client_socket.close()
def ftp_client():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口复用设置,程序退出,立即释放端口
# socket.SOL_SOCKET socket选项列表
# socket.SO_REUSEADDR 地址复用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 默认本机ip地址
server_socket.bind(("127.0.0.1", 8080))
# 最大监听个数
# 从主动套接字变成被动套接字
server_socket.listen(128)
# 和客户端通信的socket,客户端地址信息(ip,端口)
while True:
client_socket, address = server_socket.accept()
print("客户端地址", address, "链接socket", client_socket)
client_multi = multiprocessing.Process(target=handler_client_request, args=(client_socket,))
client_multi.daemon = True
client_multi.start()
server_socket.close()
if __name__ == '__main__':
ftp_client()
案例:静态Web服务器
import multiprocessing
import socket
import sys
func_list = {}
# 路由
def route(path):
def routeOut(func):
func_list[path] = func
def routeIn():
func()
return routeIn
return routeOut
@route("/index.html")
def index():
with open('index.html', encoding="utf8") as f:
conent = f.read()
return conent
@route("/main.html")
def index():
with open('main.html', encoding="utf8") as f:
conent = f.read()
return conent
class WebSocket(object):
def __init__(self, port):
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
self.tcp_server_socket.bind(("127.0.0.1", port))
self.tcp_server_socket.listen(128)
@staticmethod
def handler_client_request(client_socket):
# recv_data = client_socket.recv(1024)
recv_data = client_socket.recv(50 * 1024)
if len(recv_data) == 0:
print("客户端关闭")
return
path = recv_data.decode("utf8").split(" ")[1]
print("请求路径", path)
if path == '/':
path = '/index.html'
# 响应行
response_line = 'HTTP/1.1 200 OK\r\n'
response_header = 'server:py1.0\r\n'
# 打开资源文件
try:
response_body = func_list[path]()
except BaseException as error:
response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
response_body = "not found"
finally:
response_data = (response_line + response_header + "\r\n" + response_body).encode()
client_socket.send(response_data)
client_socket.close()
# try:
# f = open(path[1:], "rb")
# file_data = f.read()
# f.close()
# except BaseException as error:
# print("文件不存在")
# response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
# response_body = "not found"
# response_data = (response_line + response_header + "\r\n" + response_body).encode("utf8")
# client_socket.send(response_data)
# else:
# response_body = file_data
# response_data = (response_line + response_header + "\r\n").encode() + response_body
# client_socket.send(response_data)
# client_socket.close()
# response_body = '123'
# response_data = response_line + response_header + "\r\n" + response_body
# client_socket.send(response_data.encode("utf8"))
def start(self):
while True:
client_socket, addr = self.tcp_server_socket.accept()
client_process = multiprocessing.Process(target=self.handler_client_request, args=(client_socket,))
client_process.daemon = True
client_process.start()
client_socket.close()
def __str__(self):
return "CG webSocket"
if __name__ == '__main__':
# 获取动态端口
# argv 获取终端命令参数如:python xx.pu 8080 可获取列表['xx.py','8080']
# if len(sys.argv) != 2:
# "正确格式是:python 文件名 端口号"
# else:
# port = sys.argv[1]
port = 9090
webSocket = WebSocket(int(port))
webSocket.start()