利用TCP进行远程数据传输----文件传输, 数据实时传输并绘出
(初学者一枚~~还希望多多交流~)
First~~~~~文件传输
客户端:
from socket import *
import os
def main():
tcp_socket = socket(AF_INET, SOCK_STREAM)
tcp_ip = " " # 写服务器ip
tcp_port = 4995 # 连接服务器
tcp_socket.connect((tcp_ip, tcp_port))
new_file = open('22222.xls', "wb") # 创建一个空文件
time = 0 # 用与计算读取的字节数
while True:
mes = tcp_socket.recv(4096) # 接收服务器端返回的内容
if mes: # 如果内容不为空执行
new_file.write(mes) # 解码并向文件内写入
time += len(mes) # 计算字节
else: # 如果字节数为空即未收到内容
if time == 0:
new_file.close() # 关闭文件
os.remove('111.xls') # 删除刚刚创建的文件
print("没有您要下载的文件")
else:
print("文件下载成功") # 如过time有值时name文件传输完成
break
tcp_socket.close() # 关闭套接字
if __name__ == '__main__':
main()
服务器端:
import socket
def file_deal(file_name):
try:
file_name='1.xls'
files = open(file_name, "rb")
mes = files.read()
except:
print("没有该文件")
else:
files.close()
return mes
def main():
IP = " "
port = 4995
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.bind((IP, port))
tcp_socket.listen(1)
print('listen at port :', port)
client_socket, addr = tcp_socket.accept()
print('connected by', addr)
while True:
mes = file_deal('1.xls')
if mes:
client_socket.send(mes)
client_socket.close()
break
if __name__ == "__main__":
main()
传输数据并实时显示, 可以应用与脑电肌电数据发送~~~maybe 我还没有尝试~
客户端:
import socket
import sys
import matplotlib.pyplot as plt
import xlrd
import struct
IP = "="
port = 45
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
workbook = xlrd.open_workbook('1.xlsx') # 打开excel文件
sheet = workbook.sheet_by_name("1") # 打开sheet1
row_list = []
row_num = sheet.nrows
try:
client.connect((IP, port))
except Exception as e:
print('server not find or not open')
sys.exit()
trigger = input("send:")
client.sendall(trigger.encode())
if trigger:
while True:
for i in range(1, 1000):
row_data = sheet.row_values(i) # 获得第i行的数据
for data in row_data:
print(row_data)
if data != '':
send = str(data)
client.sendall(send.encode()) # 再编码发送
send=','
client.sendall(send.encode()) # 再编码发送
break
send = '1'
client.sendall(send.encode())
client.close()
服务器端:
uffer_size = 1024 ## 设置传输字节数 貌似我直接设置了~~
IP = " " ## 这个地方填写服务器所在的ip
port = 45
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ## 创建套字节
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((IP, port))
s.listen(1) ## 开始监听 最多监听括号里的个数
print('listen at port :', port)
f_row_list=[]
conn, addr = s.accept() ## 接受客户的连接请求 并得到地址
print('connected by', addr)
data = conn.recv(1024)
data = data.decode() # 解码
row_list = []
plt.close() # clf() # 清图 cla() # 清坐标轴 close() # 关窗口
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
temp=''
if data:
while True:
data = conn.recv(100) ## 一次接受多少bytes
data = data.decode()
data = temp + data ## temp 由下面可以知道,是接受数据的最后一组。原因是,可能最后一个是‘-’或者 是‘’或者是0.09中的0.0 均有可能,如果是0.0 那么下次传过来的就是9 产生了突变。因此如果上一组的最后一个不是‘,’ 那么就直接将其添加到下一组中!!!!但是如果上一组结尾是‘,’,那么就没有必要再变化,直接将temp 置为空字符~~~~~~
a = data.split(',')
if a[-1] != ',': ## 如果不是‘,’ 那么记录最后一组数据, 并把最后一组数组置为空字符
temp = a[-1]
a[-1] = ''
else:
temp = [] ## 否则(即最后一个为‘,’) 将temp 置为空 即 不需要改变
for i in a: ## 如果i不为空字符 没找到表示空字符的表示 null或者 ‘’都试过了
if (i == '1'): ## 结合客户端进行看 让客户端结束后 发送1
plt.pause(10000)
break
if i:
if i !='-':
row_list.append(float(i))
print(row_list)
ax.plot(row_list, c='b') # 绘制出来
plt.pause(0.1)
plt.pause(100000)
s.close()
plt.savefig('test.png', dpi=200, bbox_inches='tight')