Socket编程
对于Python而言,进行Socket编程,发送网络消息,可以使用Python内置的Socket库;目前使用最多的是利用TCP协议来进行网络通行的
利用TCP进行通信的双方,称之为服务端(severt)与客户端(client),TCP协议双方通信之前需要建立连接,然后才能进行信息的传递(三次握手)
编码流程:
"""服务器端:
1.实例化创建Socket对象
2.绑定本地IP地址与端口号
3.监听
4.模拟三次握手建立连接过程,返回通信Socket对象
5.进行信息的接受与发送
6.关闭连接"""
"""客户端端:
1.实例化创建Socket对象
2.与服务端建立连接(需要预先知道服务器端的IP地址与端口号)
3.进行信息的发送与接受
4.关闭连接"""
服务器端代码:
#服务端
#导入socket库
from socket import *
#定义配置参数
#本地IP地址
IP="0.0.0.0"
#本地端口号
PORT=50000
#定义一次性从SOCKET缓冲区中读取最大字节数
BUFFERMAX=512
#创建Socket对象
"""参数说明:
参数AF_INET表明该对象网络层使用IP协议
参数SOCK_STREAM表明该对象传输层使用TCP协议"""
listenSocket=socket(AF_INET,SOCK_STREAM)
#给当前SOCKET绑定地址和端口号
listenSocket.bind((IP,PORT))
#使socket进程处于监听状态,等待客户端的连接请求
#参数表明最多可以接受等待连接的客户端数目,如4表明当前最多可以接受4个客户端的请求
listenSocket.listen(4)
print("服务端启动成功,在端口号{PORT}等待客户端的连接")
"""返回参数说明:
dataSocket:新的Socket对象,用于信息传递
addr:以元组的形式返回客户端的(IP地址,端口号)
"""
dataSocket,addr=listenSocket.accept() #建立连接,三次握手过程
print("接受一个客户端连接",addr)
while True:
#读取客户端发送的信息
#参数说明:BUFFERMAX 指定从接受缓冲区中读取的最大字节数
recved=dataSocket.recv(BUFFERMAX) #一直等待对方信息,当对方关闭连接时,返回的是一个空的字节
#返回数据recved为空Byte,表明对方关闭连接,退出当前循环
if not recved:
break
#读取的数据为Bytes类型,需要解码为字符串类型
info=recved.decode()
print(f"接收到的信息为:{info}")
#发送的数据必须要为Bytes类型,需要编码
dataSocket.send(f"服务端收到的信息为: {info}".encode())
#通信结束,关闭Socket
dataSocket.close()
listenSocket.close()
客户端代码:
#客户端代码
#导入Socket库
from socket import *
#定义配置参数
IP="127.0.0.1" #服务器IP地址
SEVERT_PORT=50000 #服务器端口号
BUFFERMAX=1024 #可接收最大缓冲区个数
#创建Socket对象
dataSocket=socket(AF_INET,SOCK_STREAM)
#与服务端建立连接
dataSocket.connect((IP,SEVERT_PORT)) #模拟三次握手过程
while True:
#用户通过中断输入发送信息
tosend=input(">> ") #INPUT输入的内容为字符串形式
#发送信息为空,退出循环
if tosend=="":
break
#发送消息为Bytes类型,所以需要编码
dataSocket.send(tosend.encode())
#等待接收服务端的消息
recved=dataSocket.recv(BUFFERMAX)
#如果返回为空Bytes,表明对方一=已关闭了连接,退出循环
if not recved:
break
#打印读取的信息
print(f"客户端收到的消息为:{recved.decode()}")
#关闭连接
dataSocket.close()