1. TCP实现网页信息获取
import socket
client = socket.socket()
client.connect(("www.baidu.com", 80))
client.send(b"GET / HTTP/1.1\r\nHost:www.baidu.com\r\nConnection:close\r\n")
recvData = client.recv(1024*100)
print(recvData.decode("utf-8"))
client.close()
2. TCP实现简易web服务器
import socket
def handler(clientObj):
# 5. 接收客户端发送的请求
recvData = clientObj.recv(1024)
with open('hello.html', 'rb') as f:
sendData = f.read()
# 告诉浏览器http版本
clientObj.send(b'HTTP/1.1 200 ok\r\n\r\n')
clientObj.send(sendData)
def webServer():
# 1. 创建socket对象
server = socket.socket()
# 2. 绑定端口和ip
server.bind(('0.0.0.0', 8084))
# 3. 监听是否有客户端连接
server.listen(5)
print("http服务正在启动8080........")
while True:
# 4. 接收客户端的连接
clientObj, address = server.accept()
t = threading.Thread(target=handler, args=(clientObj, ))
t.start()
server.close()
if __name__ == '__main__':
webServer()
3. 基于TCP的通信
3.1 创建server服务器
import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET; ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 绑定一个IP和端口, 供客户端来连接;
server.bind(('172.25.254.250', 4002))
# 3. 监听是否有客户端连接
server.listen(5)
print("服务端正在启动.........")
# 4. 接收客户端的连接, accept() -> (socket object, address info)
clientSocket, address = server.accept()
print("客户端的地址:", address)
# 5. 接收客户端发送的消息
recvData = clientSocket.recv(1024)
print("服务端接收的消息:", recvData.decode('utf-8'))
# 6. 给客户端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
clientSocket.send('你好, 客户端'.encode('utf-8'))
# 7. 关闭服务端socket对象
server.close()
clientSocket.close()
3.2 创建client客户端
import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET; ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 连接服务端(ip, port)
client.connect(('172.25.254.250', 4002))
# 3. 给服务端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
client.send("你好, 服务端".encode('utf-8'))
# 4. 接收服务端回复的消息
recvData = client.recv(1024)
print("客户端接收的消息:", recvData.decode('utf-8'))
# 7. 关闭客户端socket对象
client.close()
4. 基于TCP的简易聊天室
4.1 创建server服务器:
import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET; ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 绑定一个IP和端口, 供客户端来连接;
server.bind(('172.25.254.250', 4006))
# 3. 监听是否有客户端连接
server.listen(5)
print("服务端正在启动.........")
# 4. 接收客户端的连接, accept() -> (socket object, address info)
clientSocket, address = server.accept()
print("客户端的地址:", address)
while True:
# 5. 接收客户端发送的消息
recvData = clientSocket.recv(1024)
print("服务端接收的消息:", recvData.decode('utf-8'))
# 6. 给客户端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
sendData = input('server:>> ')
if not sendData:
continue
if sendData == 'quit':
print("聊天结束.....")
break
clientSocket.send(sendData.encode('utf-8'))
# 7. 关闭服务端socket对象
server.close()
clientSocket.close()
4.2 创建client服务器端:
import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET; ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 连接服务端(ip, port)
client.connect(('172.25.254.250', 4006))
while True:
# 3. 给服务端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
sendData = input('client:>> ')
if not sendData:
continue
if sendData == 'quit':
print("聊天结束.....")
break
client.send(sendData.encode('utf-8'))
# 4. 接收服务端回复的消息
recvData = client.recv(1024)
print("客户端接收的消息:", recvData.decode('utf-8'))
# 7. 关闭客户端socket对象
client.close()
5. 基于多线程TCP的聊天室
5.1 实现server服务器
import os
import threading
from multiprocessing import Process
def get_client_conn(clientSocket, address):
while True:
# 5. 接收客户端发送的消息
recvData = clientSocket.recv(1024).decode('utf-8')
print("服务端接收的消息:", recvData, '\n')
# os.system不能保存命令的执行结果;
sendData = os.popen(recvData).read()
clientSocket.send(sendData.encode('utf-8'))
clientSocket.close()
import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET; ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 绑定一个IP和端口, 供客户端来连接;
server.bind(('172.25.254.250', 4008))
# 3. 监听是否有客户端连接
server.listen(5)
print("服务端正在启动.........")
while True:
# 4. 接收客户端的连接, accept() -> (socket object, address info)
clientSocket, address = server.accept()
print("客户端的地址:", address)
# 使用多进程
t = Process(target=get_client_conn, args=(clientSocket, address))
t.start()
5.2 实现client客户端:
import socket
# 1. 创建一个socket对象;
# family指定使用IP协议的版本: IPV4:AF_INET; ipv6: AF_INET6
# type指定传输层使用的协议类型:TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 连接服务端(ip, port)
client.connect(('172.25.254.250', 4008))
while True:
# 3. 给服务端回复消息, send(self, data: **bytes***, flags: int = ...) -> int: ...
sendData = input('client:>> ')
if not sendData:
continue
if sendData == 'quit':
print("聊天结束.....")
break
client.send(sendData.encode('utf-8'))
# 4. 接收服务端回复的消息
recvData = client.recv(1024)
print("客户端接收的消息:", recvData.decode('utf-8'))
# 5. 关闭客户端socket对象
client.close()