python和java相互通信_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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值