1、概述
实现网络编程我们需要借助Socket模块,Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
本文只实现了 单工状态的例子。
单工:简单的说就是一方只能发信息,另一方则只能收信息,通信是单向的。
关于半双工和全双工,本案例暂未试验成功。
使用之前先导入模块:
import socket
2、案例
我们需要创建一个服务端用于接收消息,创建一个客户端用于发送消息。
创建服务端流程:创建socket对象=>绑定主机和端口(bind函数)=>监听客户端(accept函数)=>接收客户端发送的信息(recv函数)=>关闭
创建服务端类ServerScoket.py:
import socket
# 创建 Socket 对象
serverScoket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取主机名
host = socket.gethostname()
# 设置一个未被占用的端口
port = 8888
# 绑定主机和端口号
serverScoket.bind((host, port))
# 设置最大连接数,超过后排队
serverScoket.listen(10)
# 设置连接超时时间15秒
serverScoket.settimeout(15)
# accept() 方法返回两个值(socket object, address info),用两个参数来接收
returnScoket, addr = serverScoket.accept()
# 接收服务端响应的数据
recMsg = returnScoket.recv(1024)
print(recMsg.decode("utf-8"))
returnScoket.close()
创建客户端类ClientSocket.py:
创建客户端流程:创建socket对象=>连接服务端的主机和端口(connect函数)=>发送消息(send函数)=>关闭
import socket
# 创建 Socket 对象
clientScoket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取主机名
host = socket.gethostname()
# 设置一个未被占用的端口
port = 8888
# 绑定主机和端口号
clientScoket.connect((host, port))
# 设置连接超时时间15秒
clientScoket.settimeout(15)
clientScoket.send("你好!我来自客户端\n".encode("utf-8"))
clientScoket.close()
输出结果:
运行时需要先运行服务端,然后再启动客户端,由于客户端是发送消息不接受消息,所以发送完之后程序退出,不再输出,所以我们只关注服务端接收的消息。
你好!我来自客户端
3、总结
注意.bind和.connect函数的参数需要通过元组传递对应的主机和端口信息。
socket用完之后需要关闭。
本文相对来说写得比较简单,算是对python3 socket有粗略的认识,其实关于实现半双工和全双工是实际生活中非常常用的,读者可以自己翻阅一些资料来实现。