我们在使用python进行消息传输时,会使用到socket来建立连接。下面我们以文件传输为例来简单讲解一下。
首先,要实现数据传输,就必须建立起服务器端和客户端。
服务器端使用的包:
import socket
import threading
import os
服务器端我们使用以下方法来做ip和port的绑定,并且设置监听数。
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.bind(("127.0.0.1", 23412))
sk.listen(10)
为了客户端连接后可以得知是否连接成功,我们设定在服务器收到客户端连接请求后,向客户端发回一条message用于反馈。
conn, address = sk.accept()
conn.sendall(bytes("连接成功!", encoding="utf-8"))
接下来是服务器端的接收线程,由于考虑到收发文件大小不确定,我们采用切片的方式进行文件收发。发送线程如下:
def send_message():
path = 'test.txt'
f = open(path)
filesize = os.path.getsize(path)
string = f.read()
flag = 0
while (flag + 1024) < filesize:
conn.sendall(bytes(string[flag:flag + 1024], encoding='utf-8'))
flag = flag + 1024
conn.sendall(bytes(string[flag:flag + 1024], encoding='utf-8'))
最后我们在主线程中开启发送子线程,并在线程结束后,断开连接。
try:
t = threading.Thread(send_message())
t.start()
except:
print("Error: unable to start thread")
sk.close()
客户端原理相似,理解了服务器端,客户端自然就理解了,楼主知道大家心急,就直接上代码了。
import socket
import threading
obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
obj.connect(("127.0.0.1", 23412))
ret = str(obj.recv(1024), encoding="utf-8")
print(ret)
def recv_message():
print('recv_message start ...')
res = str(obj.recv(1024), encoding="utf-8")
if res != '':
print(res)
try:
t = threading.Thread(recv_message())
t.start()
except:
print("Error: unable to start thread")
如果大家有什么想了解的方向或遇到什么问题,欢迎在下方评论区评论。
楼主学识浅薄,知道的问题会回复大家解决方法,不知道的也欢迎一起探讨。