一、什么是socket
socket网络通信是一种基于TCP/IP协议的通信方式,通过套接字(Socket)实现不同主机间的通信。它基于客户端-服务器架构,客户端和服务器通过Socket进行连接、通信和数据交换。在网络中,进程之间如何通信是一个基本问题。网络中的进程可以通过“IP地址、协议、端口”这三元组来唯一标识,从而建立通信。具体来说,应用层与传输层之间的接口正是套接字(Socket),它是一组接口,在设计模式中可以被视为门面模式,将复杂的TCP/IP协议族隐藏在简单的接口背后。这种设计使得程序员能够通过简单的接口调用,而不是直接与复杂的网络协议打交道。Socket网络通信主要有两种类型:流格式套接字(SOCK_STREAM)和数据报格式套接字(SOCK_DGRAM)。流格式套接字使用TCP协议,提供可靠的、双向的通信数据流,确保数据准确无误地到达另一台计算机。而数据报格式套接字则使用UDP协议,强调快速传输而非传输顺序,适用于对实时性要求高、可以容忍部分数据丢失的场景
二、socket特点
-
基于TCP/IP协议:Python的socket库支持TCP和UDP协议,其中TCP是一种可靠的面向连接的协议,而UDP是一种无连接的协议。
-
跨平台性:Python的socket库可以在多种操作系统上运行,如Windows、Linux、macOS等。
-
简单易用:Python的socket库提供了简洁的API,使得开发者能够快速地实现网络通信功能。
-
阻塞式和非阻塞式:Python的socket库可以创建阻塞式和非阻塞式的套接字。阻塞式套接字在执行send()和recv()操作时会阻塞程序,直到操作完成;非阻塞式套接字则不会阻塞程序,需要使用select模块来处理多个套接字。
-
安全性:虽然Python的socket库本身不提供加密功能,但可以通过其他库(如ssl)来实现安全的通信。
-
可扩展性:Python的socket库可以与其他库(如asyncio、twisted等)结合使用,以实现更复杂的网络通信功能。
三、客户端与服务器通信
客户端连接程序
import socket # 导入socket库,用于网络编程# 定义一个客户端连接函数
def test_client():# 建立与服务器的连接s = socket.socket() # 创建一个socket对象,默认使用TCP协议s.connect(('192.168.3.100', 4455)) # 连接到指定的IP地址和端口号# 传输数据(收发数据包)content = "hello i am clinet" # 要发送的数据内容s.send(content.encode('gbk')) # 将字符串编码为GBK格式并发送# 关闭连接s.close() # 关闭socket连接# 调用test_client()函数进行测试
# test_client()
服务端程序
import socketdef test_server():# 创建一个socket对象s = socket.socket()# 绑定服务器端口和端口号s.bind(('192.168.3.100', 4455))# 开始监听端口,等待客户端连接s.listen()# 无限循环,以便持续接收客户端的连接请求while True:# 接受客户端的连接请求,返回一个新的socket对象和客户端地址channel, client = s.accept()# 从新的socket对象中接收数据,最多接收1024字节message = channel.recv(1024)# 将接收到的数据解码为字符串并打印print(message.decode())# 调用test_server函数启动服务器
test_server()
四、实现完整交互
价值一个亿的稚能代码
服务器端
import socket# 创建一个socket对象
s = socket.socket()# 绑定IP地址和端口号,只允许本设备访问
s.bind(('127.0.0.1', 6666))# 绑定IP地址和端口号,所有IP地址均可以访问6666端口
s.bind(('0.0.0.0', 6666))# 开始监听连接请求
s.listen()# 接受客户端连接,注意:这里只能接受一个客户端连接,无法同时处理多个客户端
chane1, client = s.accept()# 无限循环,等待并处理客户端发送的消息
while True:# 再次接受客户端连接,此时accept()会进入阻塞状态,等待新的客户端连接chane1, client = s.accept()# 接收客户端发送的消息,并将其解码为字符串receive = chane1.recv(1024).decode()# 打印收到的消息print(f"收到消息: {receive}")# 将收到的消息中的"吗?"替换为"!"reply = receive.replace("吗?", "!")# 将回复消息编码为字节流并发送给客户端chane1.send(reply.encode())# 关闭socket连接
s.close()
客户端
import socket # 导入socket库,用于网络通信
s = socket.socket() # 创建一个socket对象
s.connect(('127.0.0.1', 6666)) # 连接到本地IP地址(127.0.0.1)的6666端口
while True: # 无限循环,保持与服务器的通信messge = input("请输入消息:") # 从用户输入获取消息s.send(messge.encode()) # 将消息编码为字节流并发送给服务器receive = s.recv(1024) # 接收服务器返回的数据,最大接收1024字节print(f"服务器回复:{receive.decode()}") # 打印服务器回复的消息,解码为字符串
每篇一言:结果需要的是一个开始。没开始说什么都是废话。