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、总结
上述内容已经实现了客户端和服务器之间的交互通信,但是还是存在不足,只能实现一对一的通信,另一个客户端请求连接服务器并且发送消息,只能等到第一个客户端断开连接之后才可以