客户端与服务端发送数据

Posted liuming-nimi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了客户端与服务端发送数据相关的知识,希望对你有一定的参考价值。

client端

 1 import socket
 2 import os
 3 import sys
 4 import struct
 5 #import cv2
 6 #import tkinter as tk
 7 from tkinter import filedialog
 8 from picamera import PiCamera
 9 from time import sleep
10 
11 #capture = cv2.VideoCapture(0)
12 def take_photo():
13     camera = PiCamera()
14     camera.start_preview()
15     camera.capture("./image0.jpg")
16     camera.stop_preview()
17 
18 def take_video():
19     camera = PiCamera()
20     camera.start_preview()
21     camera.start_recording("./video.h264")
22     sleep(10)
23     camera.stop_recording()
24     camera.stop_preview()
25 
26 def socket_client(a):
27     try:
28         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
29         s.connect((192.168.43.43, 6666))  # 服务器的ip及设置端口号
30     except socket.error as msg:
31         print(msg)
32         sys.exit(1)
33 
34     print(s.recv(1024).decode("utf-8"))
35 
36         #root = tk.Tk()
37         #root.withdraw()
38     if a == 1:
39         filepath = "./image0.jpg"
40     elif a == 2:
41         filepath = "./video.h264"
42     print(filepath)
43     if os.path.isfile(filepath):
44             # 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
45         fileinfo_size = struct.calcsize(128sl)
46             # 定义文件头信息,包含文件名和文件大小
47         fhead = struct.pack(
48                 128sl,
49                 os.path.basename(filepath).encode(encoding="utf-8"),
50                 os.stat(filepath).st_size
51             )
52         print(client filepath: {0}.format(filepath))
53         s.send(fhead)
54 
55         fp = open(filepath, rb)
56         while 1:
57             data = fp.read(1024)
58             if not data:
59                 print({0} file send over....format(filepath))
60                 break
61             s.send(data)
62         os.remove(filepath)
63         
64 
65         print(s.recv(1024).decode("utf-8"))
66         print(s.recv(1024).decode("utf-8"))
67         s.close()
68         
69 
70 
71 if __name__ == __main__:
72     while True:
73         userinput = int(input("请输入你想要的功能 1 拍照传输图片  2 摄像传输视频:"))
74         if userinput == 1:
75             take_photo()
76             socket_client(userinput)
77         elif userinput == 2:
78             take_video()
79             socket_client(userinput)
80         else:
81             print("未知错误,重新输入")
82             userinput = int(input("请输入你想要的功能 1 拍照传输图片  2 摄像传输视频:"))

serve端

 1 import socket
 2 import threading
 3 import sys
 4 import os
 5 import struct
 6 
 7 
 8 def socket_service():
 9     try:
10         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11         s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
12         s.bind((192.168.43.43, 6666))  # 服务器的ip及设置端口号
13         s.listen(10)# 10 表示  限制服务端同一时刻所能接受客户端连接请求的个数。
14     except socket.error as msg:
15         print(msg)
16         sys.exit(1)
17     print(Waiting connection...)
18 
19     while 1:
20         conn, addr = s.accept()
21         # 返回值是一个新的套接字描述符,它代表的是和客户端的新的连接,
22         # 可以把它理解成是一个客户端的socket, 这个socket包含的是客户端的ip和port信息 。
23         # (当然这个new_socket会从sockfd中继承服务器的ip和port信息,两种都有了),
24         # 而参数中的SOCKET s包含的是服务器的ip和port信息 。
25 
26 
27         t = threading.Thread(target=deal_data, args=(conn, addr))
28         t.start()
29 
30 
31 def deal_data(conn, addr):
32     print(Accept new connection from {0}.format(addr))
33     print(conn)
34     conn.send(Hi, Welcome to the server!.encode("utf-8"))
35 
36     while 1:
37         fileinfo_size = struct.calcsize(128sl)
38         buf = conn.recv(fileinfo_size)
39         if buf:
40             filename, filesize = struct.unpack(128sl, buf)
41             fn = filename.strip(b"x00").decode("utf-8") #将文件名中的  图片名字 提取出来
42             #strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
43             new_filename = os.path.join(./, new_ + fn)
44             print(new_filename, filesize)
45             print(file new name is {0}, filesize if {1}.format(new_filename, filesize))
46 
47             recvd_size = 0  # 定义已接收文件的大小
48             fp = open(new_filename, wb)
49             print(start receiving...)
50 
51             while not recvd_size == filesize:
52                 if filesize - recvd_size > 1024:
53                     data = conn.recv(1024)
54                     recvd_size += len(data)
55                 else:
56                     data = conn.recv(filesize - recvd_size)
57                     recvd_size = filesize
58                 fp.write(data)
59             fp.close()
60             print(end receive...)
61         conn.send(已发送.encode("utf-8"))
62         print(conn.recv(1024).decode(utf-8))
63         conn.close()
64         break
65 
66 
67 if __name__ == __main__:
68     socket_service()

 

以上是关于客户端与服务端发送数据的主要内容,如果未能解决你的问题,请参考以下文章

android 在服务器端生成json格式数据,在客户端怎么解析

java客户端与C#服务端进行socket通讯 客户端发送文本信息服务端显示

Socket服务器端如何检测客户端的连接状态?

golang代码片段(摘抄)

socket网络编程:客户端与服务端代码bug修复(代码完善)

客户端与服务端发送数据