客户端:创建TCP链接时,主动发起连接的叫做客户端
服务端:接收客户端的连接
连接其他服务器
可以通过tcp连接其他服务器。
示例:
import socket
# 1.创建一个socket
# 参数1:指定协议 AF_INET(ipv4) 或 AF_INET6(ipv6)
# 参数2:SOCK_STREAM执行使用面向流的TCP
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接
# 参数:是一个元组,第一个元素为要连接的服务器IP地址,第二个参数为端口
sk.connect(('网站域名', 80))
# 发送信息给服务端
sk.send(b'GET / HTTP/1.1\r\nHost: www.aixiashu.info\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0\r\nConnection: close\r\n\r\n')
# 等待接收数据
data = []
while True:
# 每次接收1k数据
temData = sk.recv(1024)
if temData:
data.append(temData)
else:
# 接收完数据
break
context = (b''.join(data)).decode('utf-8')
# 断开链接
sk.close()
print(context)
执行结果:
取出header头和html
示例:
head, html = context.split('\r\n\r\n', 1)
print('响应头:', head)
print('响应文本内容', html)
响应头在浏览器中会自动处理,不会显示在页面中。
执行结果:
客户端与服务器数据交互
服务端
示例:
import socket
# 创建一个socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP端口 使用自己本机ip,可通过命令行ipconfig查看获得
server.bind(('192.168.8.111', 8080))
# 监听
server.listen(3)
print('服务器启动。。。。。。')
# 等待客户端连接
clientSocket, clientAddress = server.accept()
print("%s -- %s 连接成功"%(str(clientSocket), clientAddress))
while True:
data = clientSocket.recv(1024)
print('收到'+str(clientSocket)+'的数据:'+data.decode('utf-8'))
message = input('请输入发送给客户端内容:')
clientSocket.send(message.encode('utf-8'))
客户端
示例:
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.8.111', 8080))
while True:
data = input('请输入发送内容:')
client.send(data.encode('utf-8'))
info = client.recv(1024)
print('服务器:', info.decode('utf-8'))
执行结果:
注意:
停止可以先停止客户端。当前只是单线程,需要多线程才可以多客户端连接。