什么是套接字socket编程
套接字socket是一种客户端/服务器端,即C/S的架构机制,主要用于网络中的进程之间的通信。需要两个特殊的文件,一个在服务器端,一个在客户端,并各自维护。
套接字socket编程更重要的是其编程思想,而且每一种计算机语言(可以用来写后端的语言)基本上都可以实现套接字socket编程,而不是python的专有的。
socket编程实例
下面我们用python的socket编程开发一个客户端和服务器端交互而成的计算器。注意,这里的客户端和服务器端都在本地计算机上。
server.py服务器端
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',5656)
#记住address是元组的格式,其中127.0.0.1通常用来表示本机,8888表示端口;
# 通常情况下,0~1023是保留端口,1024~65535为用户端口,可以随便设置。
#步骤:用socket()方法创建socket对象
sk = socket.socket()
#步骤:用bind()方法绑定服务器地址,这里是本机
sk.bind(ip_port)
#步骤:用listen()函数监听客户端发送来的请求
sk.listen(5)
#其中5表示在拒绝连接之前,操作系统可以挂起的最大连接数量
#步骤:利用阻塞机制,等待连接
connect, address = sk.accept()
#accept()函数返回的connect是连接的通信对象,用来接收、发送数据,address是连接客户端的地址
while True:
data = connect.recv(1024).decode()
#1024为一次接收数据的最大量——数据可以分多次进行接收——这样可以避免数据太大,瘫痪内存;
#网络编程就是对数据按规定好的协议进行组装成包、发送、接收、解码、呈现等过程的处理,
#所以注意decode()函数解码的作用
if data == 'socket_ok':
print('通信完成')
break
datalist = list(data)
f = datalist[1]
a = float(datalist[0])
b = float(datalist[2])
if f == '+':
result = a+b
elif f == '-':
result = a-b
elif f == '*':
result = a*b
elif f== '/':
result = a/b
else:
continue
connect.sendall(str(result).encode()) #这里为什么要用str()函数来转化呢?因为int或float类型没有encode()函数
#有解码,就必须有编码encode()就是用来编码的
connect.close()
client.py客户端
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1', 5656)
#注意要与server端的保持一致
#创建socket对象
sk = socket.socket()
#连接server端
sk.connect(ip_port)
while True:
data = input('计算:')
if data == '':
continue
data = data.encode() #发送之前要进行编码
sk.sendall(data)
if data == 'socket_ok':
print("socket结束!")
recv_data = sk.recv(1024).decode()
if recv_data != '':
print('%s = %s'%(data,recv_data))
sk.close()
如此,一个简易的服务器就搭建完成了。
代码输出:
上面实例的代码输出:
算:1+2
b'1+2' = 3.0
计算:1/2
b'1/2' = 0.5
计算:1*2
b'1*2' = 2.0
我们该如何同时运行server.py和client.py这两个脚本文件呢?
因为要完成这两个脚本之间的通信,两个脚本应该都被运行起来?