在python中开启thread通过socket传输文件实战应用

我们在使用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")

如果大家有什么想了解的方向或遇到什么问题,欢迎在下方评论区评论。

楼主学识浅薄,知道的问题会回复大家解决方法,不知道的也欢迎一起探讨。

你可能感兴趣的:(python)