字符串传输:
服务器端
import socket
class Server():
def __init__(self, host, port):
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((host, port))
self.server.listen(5)
def server_close(self):
self.server.close()
if __name__ == "__main__":
host = socket.gethostname()
port = 1212
server = Server(host, port)
while True:
try:
connection, addr = server.server.accept()
print(addr, ' connected!')
connection.send('Welcome!'.encode('utf-8'))
connection.close()
except ConnectionResetError as e:
print('close thread already use port')
break
server.server_close()
客户端:
import socket
class Client():
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def close(self):
self.client.close()
if __name__ == "__main__":
hostname = socket.gethostname()
port = 1212
client = Client()
client.client.connect_ex((hostname, port))
print(client.client.recv(1024).decode())
client.close()
图片(文件)传输:
服务器端:
# -*- coding=utf-8 -*-
import socket
import threading
import time
import sys
import os
import struct
import cv2
import numpy as np
import io
from PIL import Image
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = socket.gethostname()
port = 23456
s.bind((host, port))#ip和端口
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print ("Waiting...")
while 1:
conn, addr = s.accept()
# deal_data(conn, addr)
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start()
def deal_data(conn, addr):
print ('Accept new connection from {0}'.format(addr))
while 1:
fileinfo_size = struct.calcsize('128sl')
buf = conn.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.strip(str.encode('\00'))
new_filename = os.path.join(str.encode('./'), str.encode('new_') + fn)
print ('file new name is {0}, filesize is {1}'.format(new_filename, filesize))
#img_data = b''
recvd_size = 0 # 定义已接收文件的大小
fp = open(new_filename, 'wb')
print ("start receiving...")
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = conn.recv(1024)
recvd_size += len(data)
else:
data = conn.recv(filesize - recvd_size)
recvd_size = filesize
#img_data += data
fp.write(data)
fp.close()
# roiImg = Image.open(img_data)
#img = cv2.imdecode(np.frombuffer(img_data, np.uint8), cv2.IMREAD_COLOR)
# print(type(img), img.size)
# gb_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
# print(type(rgb_img), rgb_img.size)
# a = Image.fromarray(rgb_img)
# print(type(a), a.size)
# a.show()
#cv2.imshow('pic1', img)
#cv2.waitKey(100)
#conn.send('end receive...'.encode('utf-8'))
print ("end receive...")
conn.close()
break
if __name__ == '__main__':
socket_service()
客户端
# -*- coding=utf-8 -*-
import socket
import os
import sys
import struct
def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 23456
s.connect((host, port))
except socket.error as msg:
print(msg)
sys.exit(1)
# print (s.recv(1024))
while 1:
filepath = input("please input file path: ")
# files = ['pic1.jpg', 'pic2.jpg', 'pic3.jpg', 'pic4.jpg']
# dir_path = '/home/pi'
# for file in files:
# filepath = '/home/pi/pic1.jpg'
# filepath = os.path.join(dir_path, file)
if os.path.isfile(filepath):
# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size = struct.calcsize('128sl')
# 定义文件头信息,包含文件名和文件大小
fhead = struct.pack('128sl', bytes(os.path.basename(filepath).encode('utf-8')),
os.stat(filepath).st_size)
s.send(fhead)
print ('client filepath: {0}'.format(filepath))
fp = open(filepath, 'rb')
while 1:
data = fp.read(1024)
if not data:
print ('{0} file send over...'.format(filepath))
break
s.send(data)
# while s.recv(1024).decode() != 'end receive...':
# pass
s.close()
break
if __name__ == '__main__':
socket_client()