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用ConfigObj读写配置文件的实现代码
Mar 04 Python
实例讲解python函数式编程
Jun 09 Python
python进阶教程之文本文件的读取和写入
Aug 29 Python
Python中下划线的使用方法
Mar 27 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
python装饰器原理与用法深入详解
Dec 19 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
python代码xml转txt实例
Mar 10 Python
Python切片列表字符串如何实现切换
Aug 06 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与SQL注入攻击[一]
2007/04/17 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php中关于换行的实例写法
2019/09/26 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
react-native 封装选择弹出框示例(试用ios&android)
2017/07/11 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
浅析Python数据处理
2018/05/02 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
什么是python的必选参数
2020/06/21 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
大学生个人总结的自我评价
2013/10/05 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
法人授权委托书
2014/04/03 职场文书
个性车贴标语
2014/06/24 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL