
上QQ阅读APP看书,第一时间看更新
2.7.3 Socket编程
Socket又称“套接字”,应用程序通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。
Python中,我们用Socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
参数说明:
·Family:套接字家族可以是AF_UNIX或者AF_INET。
·Type:套接字类型,根据是面向连接的还是非连接的,可分为SOCK_STREAM和SOCK_DGRAM。
·Protocol:一般不填,默认为0。
常见的Socket对象方法如表2-3所示。
表2-3 常见的Socket对象方法
1.服务端的Socket编程
我们使用socket模块的socket函数来创建一个socket对象。socket对象可以通过调用其他函数来设置一个socket服务。
现在我们可以通过调用bind(hostname,port)函数来指定服务的port(端口)。
接着,我们调用socket对象的accept方法。该方法等待客户端的连接,并返回connection对象,表示已连接到客户端。
# 文件名:server.py
import socket
# 建立一个服务端
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('localhost',6999)) # 绑定要监听的端口
server.listen(5) # 开始监听,表示可以使用五个链接排队
while True: # conn就是客户端链接过来而在服务端生成的一个链接实例
conn,addr = server.accept() # 等待多个链接
print(conn,addr)
while True:
try:
data = conn.recv(1024) # 接收数据
print('recive:',data.decode()) # 打印接收到的数据
conn.send(data.upper()) # 然后再发送数据
except ConnectionResetError as e:
print('关闭了正在占线的链接!')
break
conn.close()
2.客户端的Socket编程
接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为12345。
socket.connect(hosname,port)方法打开一个TCP连接到主机为hostname、端口为port的服务商。连接后我们就可以从服务端获取数据,记住,操作完成后需要关闭连接。
# 文件名:client.py
# 客户端发送一个数据,再接收一个数据
import socket # 声明socket类型,同时生成链接对象
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('localhost',6999)) # 建立一个链接,连接到本地的6969端口
while True:
# addr = client.accept()
# print '连接地址:', addr
msg = '欢迎访问菜鸟教程!' # strip默认取出字符串的头尾空格
client.send(msg.encode('utf-8')) # 发送一条信息,Python3只接收btye流
data = client.recv(1024) # 接收一个信息,并指定接收的大小为1024字节
print('recv:',data.decode()) # 输出所接收的信息
client.close() # 关闭这个链接
现在我们打开两个终端,第一个终端执行server.py文件:
$ python server.py
第二个终端执行client.py文件:
$ python client.py 欢迎访问菜鸟教程!
这时我们再打开第一个终端,就会看到有以下信息输出:
连接地址: ('192.168.0.118', 62461)