Python与Java间Socket通信实例代码


Posted in Python onMarch 06, 2017

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 相关文章推荐
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
Python:type、object、class与内置类型实例
Dec 25 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
python的pip有什么用
Jun 17 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
python使用arcpy.mapping模块批量出图
Mar 06 #Python
python与php实现分割文件代码
Mar 06 #Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 #Python
windows下安装Python和pip终极图文教程
Mar 05 #Python
python爬虫的工作原理
Mar 05 #Python
python操作mysql数据库
Mar 05 #Python
Windows安装Python、pip、easy_install的方法
Mar 05 #Python
You might like
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
php 带逗号千位符数字的处理方法
2012/01/10 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
Python import自定义模块方法
2015/02/12 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
理解python中生成器用法
2017/12/20 Python
Python实现识别手写数字大纲
2018/01/29 Python
Django如何配置mysql数据库
2018/05/04 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
企业宣传口号
2014/06/12 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
时尚女魔头观后感
2015/06/04 职场文书
诚信考试主题班会
2015/08/17 职场文书
Python time库的时间时钟处理
2021/05/02 Python
Feign调用传输文件异常的解决
2021/06/24 Java/Android
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android