socket
客户端
import socket
if __name__ == '__main__':
# 创建socket连接对象 AF_INET:采用IPV4 SOCK_STREAM:传输协议
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(("172.0.0.1", 8081))
# 发送信息
client_socket.send("nihao".encode(encoding="utf-8"))
# 接受消息
recv_data = client_socket.recv(1024)
# 关闭连接
client_socket.close()
服务端
import socket
import threading
def handle_client(conn):
# 接受客户端数据
recv_data = conn.recv(1024)
print("客户端发送:", recv_data.decode(encoding="utf-8"))
# 发送信息给客户端
conn.send("服务端接收到了信息".encode(encoding="utf-8"))
conn.close()
if __name__ == '__main__':
# 创建服务端连接对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用,防止关闭服务后在启动报错
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定ip与端口
server_socket.bind(("", 8888))
# 设置监听
server_socket.listen(128)
while True:
# 接受客户端连接
conn, ip_port = server_socket.accept()
# 线程处理多任务
task_thread = threading.Thread(target=handle_client, args=conn)
task_thread.start()
# 关闭连接
server_socket.close()
socket返回html页面内容
# -*- coding:utf-8 -*-
import socket
if __name__ == '__main__':
# 创建socket对象
server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
server_client.bind(("", 8080))
# 监听请求
server_client.listen(128)
while True:
# 接受请求
client_conn, client_addr = server_client.accept()
# 获取浏览器请求数据
recv_data = client_conn.recv(8096).decode("utf-8")
print(recv_data)
# 读取要返回的页面内容
with open("C:/Users/huangkun/Desktop/1.html", "rb") as f:
read_data = f.read()
# 应答行
res_line = "HTTP/1.1 200 OK \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = read_data
res_data = (res_line + res_header + "\r\n").encode() + res_body
# 发送数据
client_conn.send(res_data)
# 关闭请求
client_conn.close()
浏览器输入http://127.0.0.1:8080/即可查看socket返回的页面内容
socket返回指定页面内容
# -*- coding:utf-8 -*-
import socket
if __name__ == '__main__':
# 创建socket对象
server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
server_client.bind(("", 8080))
# 监听请求
server_client.listen(128)
while True:
# 接受请求
client_conn, client_addr = server_client.accept()
# 获取浏览器请求数据
recv_data = client_conn.recv(8096).decode("utf-8")
print(recv_data)
# 解析浏览器路径
recv_list = recv_data.split(" ")
page_name = recv_list[1]
if page_name == "/":
page_name = "1.html"
try:
with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
read_data = f.read()
except Exception as e:
# 应答行
res_line = "HTTP/1.1 404 Not Found \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = "404 Not Found"
res_data = (res_line + res_header + "\r\n" + res_body).encode()
# 发送数据
client_conn.send(res_data)
else:
# 应答行
res_line = "HTTP/1.1 200 OK \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = read_data
res_data = (res_line + res_header + "\r\n").encode() + res_body
# 发送数据
client_conn.send(res_data)
# 关闭请求
client_conn.close()
根据浏览器输入的页面内容进行返回,不存在则返回404
socket获取指定页面内容,多线程版本
# -*- coding:utf-8 -*-
import socket
import threading
def client_thread(client_conn):
# 获取浏览器请求数据
recv_data = client_conn.recv(8096).decode("utf-8")
print(recv_data)
# 解析浏览器路径
recv_list = recv_data.split(" ")
if len(recv_list) == 1:
client_conn.close
return
page_name = recv_list[1]
if page_name == "/":
page_name = "1.html"
try:
with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
read_data = f.read()
except Exception as e:
# 应答行
res_line = "HTTP/1.1 404 Not Found \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = "404 Not Found"
res_data = (res_line + res_header + "\r\n" + res_body).encode()
# 发送数据
client_conn.send(res_data)
else:
# 应答行
res_line = "HTTP/1.1 200 OK \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = read_data
res_data = (res_line + res_header + "\r\n").encode() + res_body
# 发送数据
client_conn.send(res_data)
# 关闭请求
client_conn.close()
if __name__ == '__main__':
# 创建socket对象
server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
server_client.bind(("", 8080))
# 监听请求
server_client.listen(128)
while True:
# 接受请求
client_conn, client_addr = server_client.accept()
multi_task = threading.Thread(target=client_thread, args=(client_conn,))
multi_task.start()
socket获取指定页面内容,面向对象封装
# -*- coding:utf-8 -*-
import socket
import threading
class HttpClientServer:
def __init__(self):
# 创建socket对象
self.server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
self.server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
self.server_client.bind(("", 8080))
# 监听请求
self.server_client.listen(128)
def client_thread(self, client_conn):
# 获取浏览器请求数据
recv_data = client_conn.recv(8096).decode("utf-8")
print(recv_data)
# 解析浏览器路径
recv_list = recv_data.split(" ")
if len(recv_list) == 1:
client_conn.close
return
page_name = recv_list[1]
if page_name == "/":
page_name = "1.html"
try:
with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
read_data = f.read()
except Exception as e:
# 应答行
res_line = "HTTP/1.1 404 Not Found \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = "404 Not Found"
res_data = (res_line + res_header + "\r\n" + res_body).encode()
# 发送数据
client_conn.send(res_data)
else:
# 应答行
res_line = "HTTP/1.1 200 OK \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = read_data
res_data = (res_line + res_header + "\r\n").encode() + res_body
# 发送数据
client_conn.send(res_data)
# 关闭请求
client_conn.close()
def start(self):
while True:
# 接受请求
client_conn, client_addr = self.server_client.accept()
multi_task = threading.Thread(target=self.client_thread, args=(client_conn,))
multi_task.start()
if __name__ == '__main__':
http_client = HttpClientServer()
http_client.start()
socket命令行启动,并且传参端口号
# -*- coding:utf-8 -*-
import socket
import threading
import sys
class HttpClientServer:
def __init__(self, port):
# 创建socket对象
self.server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
self.server_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
self.server_client.bind(("", int(port)))
# 监听请求
self.server_client.listen(128)
def client_thread(self, client_conn):
# 获取浏览器请求数据
recv_data = client_conn.recv(8096).decode("utf-8")
print(recv_data)
# 解析浏览器路径
recv_list = recv_data.split(" ")
if len(recv_list) == 1:
client_conn.close
return
page_name = recv_list[1]
if page_name == "/":
page_name = "1.html"
try:
with open("C:/Users/huangkun/Desktop/" + page_name, "rb") as f:
read_data = f.read()
except Exception as e:
# 应答行
res_line = "HTTP/1.1 404 Not Found \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = "404 Not Found"
res_data = (res_line + res_header + "\r\n" + res_body).encode()
# 发送数据
client_conn.send(res_data)
else:
# 应答行
res_line = "HTTP/1.1 200 OK \r\n"
# 应答头
res_header = "Server:pwd\r\n"
# 应答体
res_body = read_data
res_data = (res_line + res_header + "\r\n").encode() + res_body
# 发送数据
client_conn.send(res_data)
# 关闭请求
client_conn.close()
def start(self):
while True:
# 接受请求
client_conn, client_addr = self.server_client.accept()
multi_task = threading.Thread(target=self.client_thread, args=(client_conn,))
multi_task.start()
if __name__ == '__main__':
if len(sys.argv) == 2 and sys.argv[1].isdigit():
port = sys.argv[1]
http_client = HttpClientServer(port)
http_client.start()
else:
print("参数错误")
使用sys.argv接受命令行参数,命令行执行命令如下:
python socket多任务命令行启动.py 8080
每天进步一点点,共勉~~~