Python与Java间Socket通信实例代码
Python与Java间Socket通信
之前做过一款Java的通讯工具,有发消息发文件等基本功能.可大家也都知道Java写的界面无论是AWT或Swing,那简直不是人看的,对于我们这些开发人员还好,如果是Release出去给用户看,那必须被鄙视到底.用C++的话,写的代码也是非常多的(QT这方面做得很好!),但我这里改用Python,以便到时用wxPython做界面.而且这两者跨平台也做得非常好.
这里只给出核心实现以及思路
Server(Java)接收从Clinet(Python)发送来的文件
JServer.java
importjava.io.BufferedReader; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.net.ServerSocket; importjava.net.Socket; publicclassJServerimplementsRunnable{ ServerSocketss; publicJServer()throwsException{ ss=newServerSocket(8086); newThread(this).start(); } @Override publicvoidrun(){ inti=0; System.out.println("serverstartup."); while(true){ try{ Sockets=ss.accept(); //每个客户端一个处理线程 newHandler(s,i).start(); i++; }catch(IOExceptione){ e.printStackTrace(); } } } publicstaticvoidmain(String[]args){ try{ newJServer(); }catch(Exceptione){ e.printStackTrace(); } } } classHandlerextendsThread{ Sockets; intid; publicHandler(Sockets,intid){ this.s=s; this.id=id; } @Override publicvoidrun(){ System.out.println("inhandling.."); FileOutputStreamfos=null; try{ InputStreamis=s.getInputStream(); BufferedReaderin=newBufferedReader(newInputStreamReader(is)); //从客户端读取发送过来的文件名 Stringfilename=in.readLine(); System.out.println("readline"+id+":"+filename); Filefile=newFile(filename); intlen=0; intBUFSIZE=4*1024; byte[]by=newbyte[BUFSIZE*1024]; fos=newFileOutputStream(file); while((len=is.read(by,0,BUFSIZE))!=-1){ fos.write(by,0,len); fos.flush(); } System.out.println("done."); }catch(Exceptione){ e.printStackTrace(); }finally{ //服务端就不要手贱关了socket否则Python会出现错误Errno10054让客户端关掉就行啦 try{ fos.close(); }catch(IOExceptione){ e.printStackTrace(); } } } }
Python客户端
#-*-coding:utf-8-*- #!/usr/bin/python #coding=utf-8 importtime importthreading importsocket importos classClient(): 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'starttosendfile.' exceptIOError: print'openerr' classSendFile(threading.Thread): def__init__(self,sock,file): threading.Thread.__init__(self) self.file=file self.sock=sock defrun(self): printself.file BUFSIZE=1024 count=0 name=self.file.name+'\r' #前1k字节是为了给服务端发送文件名一定要加上'\r',不然服务端就不能readline了 foriinrange(1,BUFSIZE-len(self.filename)-1): name+='?' printname self.sock.send(name) whileTrue: printBUFSIZE fdata=self.file.read(BUFSIZE) ifnotfdata: print'nodata.' break self.sock.send(fdata) count+=1 iflen(fdata)!=BUFSIZE: print'count:'+str(count) printlen(fdata) nRead=len(fdata) print'sendfilefinished.' self.file.close() self.sock.close() print'closesocket' c=Client()
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!