Socket communication between Python and Java
I have made a Java communication tool before, which has basic functions such as sending messages and files. But everyone also knows that Java writing Whether it's AWT or Swing, the interface is simply not human-readable. It's okay for us developers. If it is a Release that is shown to users, it must be despised to the end. If you use C++, you have to write a lot of code (QT This is done very well!), but I switched to Python here so that wxPython can be used as the interface. And the two cross-platforms also do very well.
Only the core implementation and ideas are given here
Server(Java) receives files sent from Clinet(Python)
JServer.java
import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class JServer implements Runnable { ServerSocket ss; public JServer() throws Exception { ss = new ServerSocket(8086); new Thread(this).start(); } @Override public void run() { int i = 0; System.out.println("server startup."); while (true) { try { Socket s = ss.accept(); // 每个客户端一个处理线程 new Handler(s, i).start(); i++; } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { try { new JServer(); } catch (Exception e) { e.printStackTrace(); } } } class Handler extends Thread { Socket s; int id; public Handler(Socket s, int id) { this.s = s; this.id = id; } @Override public void run() { System.out.println("in handling.."); FileOutputStream fos = null; try { InputStream is = s.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); // 从客户端读取发送过来的文件名 String filename = in.readLine(); System.out.println("read line " + id + " :" + filename); File file = new File(filename); int len = 0; int BUFSIZE = 4*1024; byte[] by = new byte[BUFSIZE * 1024]; fos = new FileOutputStream(file); while ((len = is.read(by, 0, BUFSIZE)) != -1) { fos.write(by, 0, len); fos.flush(); } System.out.println("done."); } catch (Exception e) { e.printStackTrace(); } finally { // 服务端就不要手贱 关了socket否则Python 会出现错误Errno 10054让客户端关掉就行啦 try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Python client
# -*- coding: utf-8 -*- #!/usr/bin/python #coding=utf-8 import time import threading import socket import os class Client(): def __init__(self): address = ('127.0.0.1', 8086) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(address) fn = 'test.zip' ff = os.path.normcase(fn) try: f = open(fn, 'rb') sendFile = SendFile(s,f) sendFile.start() print 'start to send file.' except IOError: print 'open err' class SendFile(threading.Thread): def __init__(self, sock, file): threading.Thread.__init__(self) self.file = file self.sock = sock def run(self): print self.file BUFSIZE = 1024 count = 0 name = self.file.name+'\r' # 前1k字节是为了给服务端发送文件名 一定要加上'\r',不然服务端就不能readline了 for i in range(1, BUFSIZE - len(self.filename) -1): name += '?' print name self.sock.send(name) while True: print BUFSIZE fdata = self.file.read(BUFSIZE) if not fdata: print 'no data.' break self.sock.send(fdata) count += 1 if len(fdata) != BUFSIZE: print 'count:'+str(count) print len(fdata) nRead = len(fdata) print 'send file finished.' self.file.close() self.sock.close() print 'close socket' c = Client()
Thank you for reading, I hope it can help everyone, thank you for your support of this site!
For more articles related to Socket communication example code analysis between Python and Java, please pay attention to the PHP Chinese website!