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使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
使用matplotlib中scatter方法画散点图
Mar 19 Python
ipython和python区别详解
Jun 26 Python
Python笔试面试题小结
Sep 07 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python实现中英文全文搜索的示例
Dec 04 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
中专毕业生自我鉴定
2013/11/21 职场文书
工程总经理工作职责
2013/12/09 职场文书
最热门的自我评价
2013/12/30 职场文书
法院信息化建设方案
2014/05/21 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
关爱留守儿童标语
2014/06/18 职场文书
美术专业自荐信
2014/07/07 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
挂职个人工作总结
2015/03/05 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
入党介绍人意见2015
2015/06/01 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书