我的需求是想在两个机器上仅利用python3实现数据传输。
Socket编程:
定义A机器为服务器,B机器为客户端。
在服务器上实现如下代码(server.py)
import socket
server = socket.socket()
server.bind(("A机器的IP",6969)) #绑定要监听的端口port
server.listen() # 监听
print('waiting the call')
conn,addr = server.accept() # 等电话打进来,并且返回连接对象,
print(conn)
print('the call has comming')
data = conn.recv(1024) #接收客户端的消息,这里是一个字符串
print('data:',data.decode()) # 将接受的数据进行解码
conn.send(data.upper()) # 将字符串变成大写后发生给客户端
在客户端上实现如下代码:
import socket
client = socket.socket() # 有一些默认参数,即可使用ipv4,这一句是声明socket类型和返回socket连接对象
client.connect(("A机器的IP",6969)) # 建立连接:传入服务器端IP号和要连接的应用程序的端口号
#client.send(b'Hello') # 这里只能发生字节流信息,否则报错
client.send('我是Hello'.encode(encoding='utf-8')) # 需要变成utf-8编码形式
data = client.recv(1024) #客户端可以接收服务器端的消息
print(data.decode())
client.close()
服务器端运行server.py之后,在客户端端也运行上述其对应的代码:
运行结果如下:
——————————————————————————————————————
将需求扩展:作为服务器的A机器可以实现与客户端的多次交流,且客户端可以不止一个。
在服务器上实现以下代码(server-v1.py)
'''
服务器端:
'''
import socket
server = socket.socket()
server.bind(("A机器的IP",6969)) #绑定要监听的端口port
server.listen(5) # 监听,这里表示最多有5个客户端连接服务器,python2不好使
print('waiting the call')
while True:
conn,addr = server.accept() # 等电话打进来,每个conn代表一个客户端的连接
print(conn)
print('the call has comming')
while True:
data = conn.recv(1024)
if not data :
print('this user is end,exit!n next user')
break
print('data:',data.decode())
conn.send(data.upper()) #服务器发送有最大值限制,比如32192M(瞎说的),使用sendall这个函数可以,但是客户端不能接受很多,事实上ssh确实有接受最大值限制
在客户端上实现以下代码:
import socket
client = socket.socket() # 有一些默认参数,即可使用ipv4,这一句是声明socket类型和返回socket连接对象
client.connect(("A机器的IP", 6969))
while True:
msg = input("massage:").strip()
if len(msg) == 0:
continue
client.send(msg.encode(encoding='utf-8')) # 不能发空的东西
data = client.recv(1024)
print(data.decode())
client.close()
两端代码在先后依次在服务器端和客户端执行结果如下:
这两段代码的设计也存在一定的问题,一旦双方任意一个机器停掉其程序的运行,则传输立即结束;
而且A服务器也无法实现与多台客户端的交流,第一次与客户端实现交流后,当客户端断开连接,服务器端也会自动停止程序的运行。
参考链接: https://blog.csdn.net/weixin_42053726/article/details/86750117
PS:感谢参考文章的作者,虽然需求问题尚未完全解决,但也对两端通信进行了初步的学习,后续待我继续深耕。