前言:本篇讲解的是TCP中建立连接请求的客户端程序和等待接受连接请求的服务端程序
TCP客户端程序开发流程及应用实践
1. socket 模块
socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
# 导⼊socket模块
import socket
# 创建客户端socket对象使⽤socket类
socket.socket(AddressFamily, Type)
2.客户端socket类的参数和方法说明:
参数名 | 说明 |
AddressFamily | IP地址类型, 分为IPv4和IPv6 |
Type | 传输协议类型 |
3. 开发客户端需要使用的函数(TCP):
方法名 | 说明 |
connect | 和服务端套接字建立连接 |
send | 发送数据 |
recv | 接受数据 |
accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
connect() | 主动初始化TCP服务器连接 |
close | 关闭连接 |
4.基本语法(五步走)
# 客户端程序
import socket
# 创建socked对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立与服务器的连接
connect = s.connect_ex(('127.0.0.1', 9090))
# 发送数据
s.send('holly')
# 关闭连接
s.close()
5.示例代码:
import socket
if __name__ == '__main__':
# 1、创建客户端套接字对象
#socket.AF_INET--- 使⽤IPv4协议,AF_INET6---使⽤IPv6协议
#socket.SOCK_STREAM--- 使⽤TCP协议,SOCK_DGRAM---使⽤UDP协议
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、和服务器端套接字建⽴连接(参数必须是⼀个元祖)
tcp_client_socket.connect(("127.0.0.1", 8080))
# 3、发送数据
tcp_client_socket.send('hello, 你好啊'.encode(encoding='utf-8'))
# tcp_client_socket.send('hello, 你好啊'.encode(encoding='gbk'))
# 4、接收数据
recv_data = tcp_client_socket.recv(1024).decode('utf-8')
# recv_data = tcp_client_socket.recv(1024).decode('gbk')
print(f"接收到的数据为:{recv_data}")
# 5、关闭客户端套接字
tcp_client_socket.close()
TCP服务器端开发流程及应用实践
1.客户端socket类的参数和方法说明:
参数名 | 说明 |
AddressFamily | IP地址类型, 分为IPv4和IPv6 |
Type | 传输协议类型 |
2.开发服务器端需要使用的函数:
方法名 | 说明 |
bind | 绑定IP地址和端口号 |
listen | 设置监听 |
accept | 等待接受客户端的连接请求 |
send | 发送数据 |
recv | 接收数据 |
3.基本语法(七步走)
# 服务端程序
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET表示使用IPv4地址
# socket.SOCK_STREAM表示使用TCP协议
# 绑定IP和端口号
s.bind(('127.0.0.1', 9099))
# '127.0.0.1'是本机地址,9099是监听的端口号
# 开启监听客户端的请求
s.listen(50)
# 参数50表示最大连接数,即同一时间可以等待的最大未处理连接数量
print("服务器启动,等待客户端连接...")
# 接受客户端的连接请求
c_socket, c_ipport = s.accept()
# accept()方法阻塞等待客户端连接,连接成功后返回一个新的socket对象c_socket和客户端的地址信息c_ipport
print(f'来自{c_ipport}的客户端已连接')
# 接收客户端发送的数据
c_data = c_socket.recv(1024) # 使用1024字节的缓冲区
# recv(1024)表示最多接收1024字节的数据
print(f'客户端发送来的请求: {c_data.decode()}')
# 使用decode()方法将接收到的字节串数据解码为字符串
# 关闭与客户端的连接
c_socket.close()
# 关闭与客户端的连接,释放资源
# 关闭服务端socket
s.close()
# 关闭服务端socket,停止监听端口
4.示例代码
import socket
if __name__ == '__main__':
# 1、创建服务器端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP地址与端⼝号, 127.0.0.1---本机IP,默认可以不写
tcp_server_socket.bind(("", 8888))
# 3、开启监听,默认最⼤连接数为128
tcp_server_socket.listen(128)
# 4、等待接收客户端连接请求
conn_socket, ip_port = tcp_server_socket.accept()
print('客户端IP+端⼝:', ip_port)
# 5、接收数据
recv_data = conn_socket.recv(1024)
print('接收到的数据:', recv_data.decode())
# 6、发送数据
conn_socket.send("客户端的数据已经收到了".encode())
# 7、关闭套接字,释放资源
conn_socket.close()
tcp_server_socket.close()
总结示例代码:
客户端代码
# 客户端程序
import socket # 导入socket模块,用于创建和管理网络连接
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET表示使用IPv4地址
# socket.SOCK_STREAM表示使用TCP协议
# 建立与服务器的连接
connect = s.connect_ex(('127.0.0.1', 9099))
# connect_ex()方法用于建立连接,返回值为0表示连接成功,非0表示连接失败
# '127.0.0.1'是服务器的IP地址,9099是服务器监听的端口号
# 检查连接是否成功
if connect == 0:
print("连接成功")
# 发送数据
s.send('holly'.encode()) # 将字符串编码为字节串后发送
# send()方法用于发送数据,需要传入字节串类型的数据
else:
print(f"连接失败,错误码: {connect}")
# 关闭连接
s.close() # 关闭socket连接,释放资源
服务端代码
# 服务端程序
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET表示使用IPv4地址
# socket.SOCK_STREAM表示使用TCP协议
# 绑定IP和端口号
s.bind(('127.0.0.1', 9099))
# '127.0.0.1'是本机地址,9099是监听的端口号
# 开启监听客户端的请求
s.listen(50)
# 参数50表示最大连接数,即同一时间可以等待的最大未处理连接数量
print("服务器启动,等待客户端连接...")
# 接受客户端的连接请求
c_socket, c_ipport = s.accept()
# accept()方法阻塞等待客户端连接,连接成功后返回一个新的socket对象c_socket和客户端的地址信息c_ipport
print(f'来自{c_ipport}的客户端已连接')
# 接收客户端发送的数据
msg = ''
while True:
c_data = c_socket.recv(1) # 使用1024字节的缓冲区
print(f'客户端发送来的请求: {c_data.decode()}')
msg += c_data.decode()
if len(c_data)==0:
break
# recv(1024)表示最多接收1024字节的数据
# print(f'客户端发送来的请求: {c_data.decode()}')
print(msg)
# 使用decode()方法将接收到的字节串数据解码为字符串
# 关闭与客户端的连接
c_socket.close()
# 关闭与客户端的连接,释放资源
# 关闭服务端socket
s.close()
# 关闭服务端socket,停止监听端口
分别运行客户端和服务端