国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python與Java間Socket通信實例代碼

2020-02-23 04:25:44
字體:
來源:轉載
供稿:網友

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-8import timeimport threadingimport socketimport 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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平凉市| 延津县| 柘荣县| 县级市| 海南省| 辽源市| 即墨市| 紫阳县| 巴彦县| 贵州省| 盐亭县| 阆中市| 大田县| 连云港市| 金乡县| 常宁市| 通河县| 房产| 宁海县| 洛扎县| 桂东县| 广东省| 甘肃省| 秀山| 星子县| 宝鸡市| 靖宇县| 镇沅| 迁西县| 浠水县| 沭阳县| 从江县| 雷州市| 永济市| 雅江县| 西城区| 石狮市| 镶黄旗| 万全县| 留坝县| 宁津县|