先来一张图
补充知识点:
tcp是什么:是协议,给一个就好,暂时不深究
ip地址:是协议地址,让socket找到你的设备(如192.168.34.233,类似于 中国 、广东、深圳、xx区、xx街道、xxxx)
端口是什么:端口是用来找到你的程序的(理解为通过房间号找房间就行)
重点!!!不理解可以,但是要把下面的代码拿过去运行一下、修改一下。如可以,连接一下其他设备和其他设备通信一下,你会更有兴趣(把服务器的ip地址改为自己电脑的ip地址,客户端给成服务器绑定的地址)
ps:
获取自己电脑的ip地址
win+R
输入cmd 后按enter
在黑窗口中输入ipconfig,你就能看到类似的
ipv4——-——————192.222.22.222
客户端代码:
# 导入Python标准库的socket模块,用于实现网络通信
import socket
# 1. 创建客户端socket对象(不指定参数时默认使用IPv4地址族和TCP协议)
# 参数说明:
# - 不写参数等价于 socket.AF_INET(IPv4) + socket.SOCK_STREAM(TCP协议)
socket_client = socket.socket()
# 2. 建立与服务端的连接(网络通信的"三次握手"在此阶段完成)
# connect() 方法参数:
# - 必须传入包含服务器地址的元组 (host, port)
# - '127.0.0.1' 表示本地回环地址(用于测试本机服务)
# - 8080 必须与服务端绑定的端口号完全一致
# 注意:如果服务端未启动,此处会抛出ConnectionRefusedError
socket_client.connect(('127.0.0.1', 8080))
# 3. 向服务端发送消息(数据必须转换为字节流)
# send() 方法特性:
# - 发送字符串需要显式编码(这里使用UTF-8编码)
# - 数据会进入操作系统内核的发送缓冲区
# - 返回实际发送的字节数(网络状况可能导致分次发送)
socket_client.send('hello server'.encode('utf-8'))
# 4. 接收服务端响应(阻塞方法,会等待直到收到数据或连接关闭)
# recv() 方法参数:
# - 1024 表示一次最多接收的字节数(缓冲区大小)
# - 实际接收数据量可能小于该值(取决于网络包大小)
data = socket_client.recv(1024)
# 5. 处理接收到的字节数据(需要与服务端使用相同编码解码)
# 打印说明:
# - decode() 将字节流转换为字符串
# - 如果服务端发送非文本数据(如图片),此处会解码失败
print('收到服务端响应:', data.decode('utf-8'))
# 6. 关闭客户端连接(发送FIN包结束TCP连接)
# 关闭顺序说明:
# - 先关闭发送通道(socket.shutdown(1))可选择性执行
# - close() 会释放系统资源并终止连接
socket_client.close()
# 导入Python标准库中的socket模块,用于网络通信
import socket
# 创建一个服务器端的socket对象(AF_INET表示IPv4地址,SOCK_STREAM表示TCP协议)
socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器地址和端口号
# 参数:元组 (IP地址, 端口号),其中:
# - '127.0.0.1' 是本地回环地址(仅限本机访问)
# - 8080 是自定义端口号(需确保未被占用)
socket_server.bind(('127.0.0.1', 8080))
# 设置服务器最大监听连接数(操作系统内核中等待处理的连接队列长度)
# 参数:10 表示最多允许10个客户端在队列中等待连接
socket_server.listen(10)
# 阻塞等待客户端连接(程序会在此暂停,直到有客户端连接)
# accept() 返回两个值:
# - newserver: 与客户端通信的新socket对象(专用于此连接)
# - client_addr: 客户端的地址信息元组 (客户端IP, 客户端端口)
newserver, client_addr = socket_server.accept()
print('已建立的连接对象:', newserver) # 打印连接套接字对象信息
print('客户端地址信息:', client_addr) # 打印客户端网络地址
# 接收客户端发送的数据(最大接收1024字节,需根据实际调整缓冲区大小)
# recv() 是阻塞方法,会等待直到收到数据
data = newserver.recv(1024)
# 将接收的字节数据解码为UTF-8字符串并打印
print('收到客户端消息:', data.decode('utf-8'))
# 向客户端发送响应数据(需将字符串编码为字节流)
newserver.send('你好客户端'.encode('utf-8'))
# 关闭当前客户端连接(释放系统资源)
newserver.close()
# 关闭服务器socket(停止接收新连接)
socket_server.close()