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数据操作方法封装类实例
Jun 23 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
python命名空间(namespace)简单介绍
Aug 10 Python
python实现邮件发送功能
Aug 10 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
用python实现学生管理系统
Jul 24 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
PHP安全防范技巧分享
2011/11/03 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
python中的itertools的使用详解
2020/01/13 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
村委会贫困证明
2014/01/14 职场文书
活动总结报告怎么写
2014/07/03 职场文书
2014年教师节活动总结
2014/08/29 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android