python 使用socket模块进行实时显示数据

利用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')

你可能感兴趣的:(python 使用socket模块进行实时显示数据)