TCP是传输控制协议,建立双向通道。
三次握手,建立连接
反馈机制:一次请求必须有一次响应。即收到请求后,必须告知对方已收到请求。
四次挥手,断开连接
定义:python内置的模块,又称套接字,用来封装互联网协议(应用层以下的层)
作用:实现互联网协议应用层以下的工作,提高开发效率
使用方式:见代码
import socket
# 获取socket 对象
server = socket.socket()
# 绑定服务端ip 地址和端口
# 127.0.0.1是回环地址,表示本机ip
server.bind(('127.0.0.1', 8080))
# 半数据池,表示可以同时让多少个客户端访问。
# 一个客户端正在交互,剩下的等待交互,listen(n):n+1个客户端
server.listen(5)
# 阻塞,直到客户端访问,返回连接请求和客户端IP
conn, client = server.accept()
# 接收客户端发送的信息并打印
# 接收默认最大字节数:1024(可根据内存自行调整)
client_data = conn.recv(1024).decode('utf-8')
print(f"来自客户端的消息:{client_data}")
# 向客户端发送消息
send_msg = input("请输入指令>>>>>:").strip().encode('utf-8')
conn.send(send_msg)
# 关闭连接
conn.close()
# 关闭服务
server.close()
import socket
# 创建socket对象
client = socket.socket()
# 向服务端请求连接
client.connect(('127.0.0.1', 9527))
# 向服务端发送数据,send只接收二进制数据
client_msg = input("请输入要发送给服务端的信息>>>>:").strip()
client.send(client_msg.encode('utf-8'))
# 接收服务端返回的数据
# 接收默认最大字节数:1024(可根据内存自行调整)
client_data = client.recv(1024).decode('utf-8')
print(f"来自服务端的消息:{client_data}")
# 关闭连接
client.close()
注意:
# 客户端.py
import socket
server = socket.socket()
server.connect(("127.0.0.1", 9527))
# 连续发送
server.send(b"hello")
server.send(b"hello")
server.send(b"hello")
server.close()
# 服务端.py
import socket
from socket import SOL_SOCKET
from socket import SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 9527))
server.listen(5)
conn, client = server.accept()
data1 = conn.recv(1024)
data2 = conn.recv(1024)
data3 = conn.recv(1024)
print(data1)
print(data2)
print(data3)
conn.close()
server.close()
输出结果
b'hellohellohello'
b''
b''
# 客户端.py
import socket
client = socket.socket()
client.connect(('127.0.0.1', 9527))
client.send(b'hello world!')
client.send(b'lift is smart!')
client.close()
# 服务端.py
import socket
from socket import SOL_SOCKET
from socket import SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 9527))
server.listen(5)
conn, client = server.accept()
re_data1 = conn.recv(5).decode('utf-8')
re_data2 = conn.recv(5).decode('utf-8')
print(re_data1)
print(re_data2)
conn.close()
server.close()
输出结果
hello
worl
定义:python内置的模块,可以将 固定长度的数据,打包成固定格式的长度
作用:将真实数据,做成一个固定长度的报头,客户端发送给服务端,服务端可以接收报头(反之亦然)。然后对报头进行解包,获取真实数据的长度,进行接收即可。
使用,以现象二举例(实质都一样解决)
# 客户端.py
import socket
import struct
client = socket.socket()
client.connect(('127.0.0.1', 9527))
msg1 = 'hello world!'
# 使用struct模块中的pack方法,模式‘i’表示4个字节
# 将要发送的数据长度打包成一个header
header1 = struct.pack('i', len(msg1))
# 先将报头发送给服务端
client.send(header1)
# 再将真实数据发送给服务端
client.send(msg1.encode('utf-8'))
# 服务端.py
import socket
import struct
server = socket.socket()
server.bind(('127.0.0.1', 9527))
server.listen(5)
conn, client = server.accept()
# 读取报头
header = conn.recv(4)
# 使用struct.unpack 解析真实数据长度
header_len = struct.unpack('i', header)[0]
# 读取真实数据
re_data = conn.recv(header_len)
print(re_data.decode('utf-8'))
conn.close()
server.close()
原文:https://www.cnblogs.com/xiaodan1040/p/11991637.html