在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
小编初学者,只能写一些例子。
先写一个 服务端的例子:
作为本地服务器,端口为8080,监听到请求后 发送hello world。
import socket def fun1(): # 创建服务端 server = socket.socket() # 绑定IP 端口 启动本地的服务器 server.bind(('0.0.0.0', 8080)) # 监听 有没有人访问 server.listen(5) # 连接数量 # 接受 conn, addr = server.accept() print(addr) # 接收数据 conn.send(b'hello world') # data = conn.recv(1024)
下面创建一个客户端,用来发送请求。
def fun(): # 客户端 client = socket.socket() # 连接百度服务器 client.connect(('0.0.0.0', 8080)) # 构造报文 data = b'GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n' # 发送报文 client.send(data) # 接受数据 res = client.recv(1024) # print(res) temp = b'' while res: temp += res res = client.recv(4096) # 提取正文 # print(re.findall(b'\r\n\r\n(.*)', temp, re.S)[0]) print(temp.decode()) fun()
客户端发送请求之后会,服务器会发送 ‘hello world’。
下面 写一个客户端访问 2717.com 获取图片数据。
import socket import ssl import re # 1 找到图片的来源 从某个服务器下载的 # 2network 中的image项 # 3 https://t1.hddhhn.com/uploads/tu/201905/30/56dg.jpg client1 = socket.socket() # HTTP client = ssl.wrap_socket(socket.socket()) # HTTPS 协议客户端 # 访问image url # 构造报文 data = b'GET /uploads/tu/201905/30/56dg.jpg HTTP/1.1\r\nHost: t1.hddhhn.com\r\n\r\n' # 请求服务器 client.connect(('t1.hddhhn.com', 443)) client.send(data) # 接受图片的数据 # res = client.recv(1024) # print(res) # 拿到二进制的数据 img_first_data = client.recv(1024) length = int(re.findall(b'Content-Length: (.*?)\r\n', img_first_data, re.S)[0]) print(length) img_data = b'' img_data += re.findall(b'\r\n\r\n(.*)', img_first_data, re.S)[0] while True: temp = client.recv(1024) if temp: img_data += temp else: break if len(img_data) >= length: # 数据是否接受完成 break print(len(img_data), length) with open('test.jpg', 'wb') as f: f.write(img_data)