Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielcodeanalyse für die Socket-Kommunikation zwischen Python und Java

Beispielcodeanalyse für die Socket-Kommunikation zwischen Python und Java

高洛峰
高洛峰Original
2017-03-08 09:23:411386Durchsuche

Socket-Kommunikation zwischen Python und Java

Ich habe schon einmal ein Java-Kommunikationstool mit Grundfunktionen wie dem Senden von Nachrichten und Dateien erstellt, aber jeder kennt auch das Java-Schreiben Ob AWT oder Swing, die Schnittstelle ist für uns Entwickler einfach nicht lesbar. Wenn es sich um ein Release handelt, das den Benutzern angezeigt wird, muss es bis zum Ende verachtet werden viel Code (QT Das ist sehr gut gemacht!), aber ich bin hier auf Python umgestiegen, damit wxPython als Schnittstelle verwendet werden kann. Und die beiden Cross-Plattformen funktionieren auch sehr gut und Ideen finden Sie hier

 

Server (Java) empfängt von Clinet (Python) gesendete Dateien

 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()

Vielen Dank fürs Lesen, ich hoffe, es kann allen helfen, vielen Dank für Ihre Unterstützung von diese Seite!

Weitere Artikel zur Beispielcodeanalyse für die Socket-Kommunikation zwischen Python und Java finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn