Python與Java間Socket通訊
之前做過一款Java的通訊工具,有發訊息文件等基本功能.可大家也都知道Java寫的介面無論是AWT或Swing,那簡直不是人看的,對於我們這些開發人員還好,如果是Release出去給用戶看,那必須被鄙視到底.用C++的話,寫的程式碼也是非常多的(QT這方面做得很好!),但我在這裡改用Python,以便到時用wxPython做界面.而且這兩者跨平台也做得非常好.
這裡只給出核心實現以及思路
Server(Java)接收從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客戶端
# -*- 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()
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!
更多Python與Java間Socket通訊實例程式碼分析相關文章請關注PHP中文網!