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读取oracle函数返回值
Jul 18 Python
Python中模块string.py详解
Mar 12 Python
python简单实例训练(21~30)
Nov 15 Python
python清除字符串中间空格的实例讲解
May 11 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
python基于exchange函数发送邮件过程详解
Nov 06 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php绘制一条弧线的方法
2015/01/24 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
微信小程序文章详情页面实现代码
2018/09/10 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
python读写ini配置文件方法实例分析
2015/06/30 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python多维数组切片方法
2018/04/13 Python
python动态进度条的实现代码
2019/07/03 Python
python list转置和前后反转的例子
2019/08/26 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
通信生自我鉴定
2014/01/18 职场文书
亲属关系公证书
2014/04/08 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书