1、sokect客户端 客户端向服务器请求连接,连接上之后,再进行交互 客户端实现逻辑流程如下: 1. 生成socket连接对象 2. 开始连接 3. 发送数据 4. 接收数据 5. 关闭sokect
具体实现的代码如下所示:
# Author: Mr.Xue # 2019.10.29 # socket_client.py import socket client = socket.socket() # 声明socket类型,同时生成socket连接对象 client.connect(('localhost', 6961)) # 开始连接,ip地址为本地,端口号为6961 # 接收客户端发来的文件 # f = open("t1.avi", "wb") while True: msg = input(">>") # 输入要发送的信息 print(len(msg)) if len(msg) == 0: continue # 判断输入的信息是否为空,如果空,重新输入 client.send(msg.encode("utf-8")) # 发送信息到服务器 data = client.recv(1024) # 接收服务器发过来的信息 print('client_recv:', data.decode()) # 打印服务器发来的信息 # f.write(data) # 接收的时候也是有限制的,不能一次性全部收过来 # f.flush() client.close() # 最后,关闭客户端2、服务器 服务器先启动监听,等待客户端连接,连接上之后,接收客户端的消息指令,作出响应 服务器实现逻辑流程如下: 1. 生成socket连接对象 2. 监听 3. 等待客户端连接 4. 接收客户端消息/指令 5. 作出回应 6. 关闭socket
# Author: Mr.Xue # 2019.10.29 #socket_server.py import socket, os server = socket.socket() # 声明socket类型,同时生成socket连接对象 server.bind(('localhost', 6961)) # 绑定要监听端口 server.listen(3) # 监听 print("我要等电话了") while True: conn, addr = server.accept() # 等待电话打进来 # conn就是客户端连过来而在服务器端为其生成的一个连接实例 print(conn, addr) print("电话来了") while True: data = conn.recv(1024) # 等待数据过来并接收 if not data: # 如果没有数据,说明有一个客户端离线 print("lost a link...") break print("server_recv: ", data.decode()) # 打印接收到的数据 conn.send(data.upper()) # 将接收到的数据转换成大写发回给客户端 # 2.接收cmd命令并执行,将结果返回 # res = os.popen(data).read() # conn.send(res) # 3.打开本地文件,发送出去 # f = open("test.avi") # data = f.read() # conn.send(data) # 只能发送一下部分 # conn.sendall(data) # 全部发送 server.close() # 关闭服务器3、运行结果 现在客户端和服务器的代码都完成了,来测试一下,先运行服务器
xue@xue-MacBookAir:~/python_learn$ python3 socket_server.py 我要等电话了现在服务器已经启动,代码运行到accept()就阻塞了,等待客户端连接,现在启动客户端
客户端:
xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py >>服务器:
xue@xue-MacBookAir:~/python_learn$ python3 socket_server.py 我要等电话了 <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6961), raddr=('127.0.0.1', 38096)> ('127.0.0.1', 38096) 电话来了客户端等待用户输入内容,服务器从accept()处现在运行到了conn.recv(1024)处,等待接收数据,现在客户端输入数据并发送
客户端:
xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py >>hello 5 client_recv: HELLO >>服务器:
xue@xue-MacBookAir:~/python_learn$ python3 socket_server.py 我要等电话了 <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6961), raddr=('127.0.0.1', 38096)> ('127.0.0.1', 38096) 电话来了 server_recv: hello客户端成功发送hello给服务器,服务器接收到之后将其转换成大写又发回给客户端,又等待客户端发数据,形成循环
4、总结 上述内容已经实现了客户端和服务器之间的交互通信,但是还是存在不足,只能实现一对一的通信,另一个客户端请求连接服务器并且发送消息,只能等到第一个客户端断开连接之后才可以