java服务端+python客户端 使用Socket进行消息、图片传输
最近做一个树莓派的项目要把树莓派的数据传输到本地电脑上进行处理,网上查了很多解决方案,因为两种语言的不同网上关于java与python的sokect 互传比较少,下面是自己按照自己的思路写的socket供大家参考,有bug之处欢迎大佬给于指点
java服务端代码:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/****
*
* @author lzw
* 服务器端socket多线程消息接收发送与图片接收
*
*/
public class Server_Test extends Thread{
ServerSocket server = null;
Socket socket = null;
public Server_Test(int port) {
try {
server = new ServerSocket(port); //定义连接的端口号
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run(){
super.run();
try{
System.out.println("wait client connect...");
socket = server.accept();
new sendMessThread().start();//连接并返回socket后,再启用发送消息线程
System.out.println(socket.getInetAddress().getHostAddress()+"SUCCESS TO CONNECT...");
InputStream in = socket.getInputStream(); //获取客户端传来的消息
int len = 0;
byte[] buf = new byte[1024];
while ((len=in.read(buf))!=-1){
String msg=new String(buf,0,len); //传化
System.out.println("client saying: "+msg);
if(msg.equals("ready_send_image")) { //传输图片标识
System.out.println("收到收到");
receiveImageThread receiveImage = new receiveImageThread();
receiveImage.start();//启动图片接收线程
Thread.sleep(1000); //给1s的时间图片线程接收图片
receiveImage.interrupt(); //中断图片接收线程
}
}
}catch (IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//图片接收线程
class receiveImageThread extends Thread{
@Override
public void run(){
super.run();
InputStream in= null;
FileOutputStream fos = null;
try{
if(socket != null){
System.out.println("开始图片接收");
in = socket.getInputStream();
int len = 0;
byte[] buf = new byte[1024];
fos = new FileOutputStream("server.jpg");
while ((len=in.read(buf))>0){
fos.write(buf,0,len);
}
System.out.println("图片接收完成");
}
in.close();
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
//消息发送线程
class sendMessThread extends Thread{
@Override
public void run(){
super.run();
Scanner scanner=null;
OutputStream out = null;
try{
if(socket != null){
scanner = new Scanner(System.in);
out = socket.getOutputStream();
String in = "";
do {
in = scanner.next();
out.write(("server saying: "+in).getBytes());
out.flush();//清空缓存区的内容
}while (!in.equals("q"));
scanner.close();
try{
out.close();
}catch (IOException e){
e.printStackTrace();
}
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
//函数入口
public static void main(String[] args) {
Server_Test server = new Server_Test(9999);
server.start();
}
}
python客户端代码:
import socket
import sys
import threading
#消息发送线程
class sendMessThread(threading.Thread):
def __init__(self,s):
threading.Thread.__init__(self)
self.s=s
def run(self):
print('发送消息线程启动')
temp_data = 'temp:25 h:80'
self.s.send(temp_data.encode('utf-8'))
print('send_temp_ok')
while True:
dd = input()
self.s.send(dd.encode('utf-8'))
#图片发送线程
class sendImageThread(threading.Thread):
def __init__(self,s):
threading.Thread.__init__(self)
self.s=s
def run(self):
print('发送图片线程启动')
filepath = 'people.jpg' # 输入需要传输的图片名 xxx.jpg
fp = open(filepath, 'rb') # 打开要传输的图片
while True:
data = fp.read(1024) # 读入图片数据
if not data:
print('{0} send over...'.format(filepath))
break
self.s.send(data) # 以二进制格式发送图片数据
class Client(threading.Thread):
def __init__(self, ip, port):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
def run(self):
try:
s = socket.socket() # 建立连接
s.connect((self.ip,self.port)) # 服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip
except socket.error as msg:
print(msg)
print(sys.exit(1))
#消息线程启动
sendMess = sendMessThread(s)
sendMess.start()
while True:
rec_data = s.recv(1024) #接收服务端数据
msg = str(rec_data, 'gbk')
if(msg=='server saying: ok'):
s.send('ready_send_image'.encode('utf-8')) #图片传输标志
#开启图片传输线程
sendImage = sendImageThread(s)
sendImage.start()
else:
print(msg)
if __name__ == '__main__':
client = Client('127.0.0.1',9999)
client.start()
效果: