实例介绍
【实例简介】socket上传下载文件,含服务器端 以及客户端 完整代码
【实例截图】
【核心代码】
android客户端代码:
package net.testSocket; import java.net.*; import java.io.*; public class ClientSocket { private String ip; private int port; private Socket socket = null; DataOutputStream out = null; DataInputStream getMessageStream = null; public ClientSocket(String ip, int port) { this.ip = ip; this.port = port; } /** * 创建socket连接 * * @throws Exception * exception */ public void CreateConnection() throws Exception { try { socket = new Socket(ip, port); } catch (Exception e) { e.printStackTrace(); if (socket != null) socket.close(); throw e; } finally { } } public void sendMessage(String filePath) throws Exception { try { //获取本地文件 File file = new File(filePath); getMessageStream = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); out = new DataOutputStream(socket.getOutputStream()); // out.writeUTF(filePath); //发送文件属性 out.writeUTF(file.getName()); out.flush(); out.writeLong((long) file.length()); out.flush(); int bufferSize = 1024*8; byte[] buf = new byte[bufferSize]; while (true) { int read = 0; if (getMessageStream != null) { read = getMessageStream.read(buf); } if (read == -1) { break; } out.write(buf, 0, read); } out.flush(); getMessageStream.close(); System.out.println("-----发送完成------"); } catch (Exception e) { System.out.println(e.toString()); } finally { if (out != null) out.close(); } } public DataInputStream getMessageStream() throws Exception { try { getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream())); return getMessageStream; } catch (Exception e) { e.printStackTrace(); if (getMessageStream != null) getMessageStream.close(); throw e; } finally { } } public void shutDownConnection() { try { if (out != null) out.close(); if (getMessageStream != null) getMessageStream.close(); if (socket != null) socket.close(); } catch (Exception e) { } } }
服务器端代码:
package com.server.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; public class ServerTest { int port = 8888;//端口号,必须与客户端一致 // 选择进行传输的文件(测试) String filePath = "E:\\img1.png"; Socket client; void start() { try { ServerSocket serverSocket = new ServerSocket(port); while (true) { client = serverSocket.accept(); try { // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。 System.out.println("-----建立socket链接----"); //接受客户端信息 DataInputStream dis = new DataInputStream(new BufferedInputStream(client.getInputStream())); // System.out.println(dis.readLine());//接收文字信息 //接收客户端发送的文件 getMessage(dis); //向客户端发送文件(测试) // setMessage(filePath); dis.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ client.close(); System.out.println("close"); } } } catch (Exception e) { e.printStackTrace(); } } //向客户端发送信息 private void setMessage(String filePath) throws IOException{ File fi = new File(filePath); System.out.println("要发送的文件长度:" (int) fi.length()); //向客户端发送信息 DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); DataOutputStream ps = new DataOutputStream(client.getOutputStream()); //将文件名及长度传给客户端。中文名需要处理 ps.writeUTF(fi.getName()); ps.flush(); ps.writeLong((long) fi.length()); ps.flush(); int bufferSize = 8192; byte[] buf = new byte[bufferSize]; while (true) { int read = 0; if (fis != null) { read = fis.read(buf); } if (read == -1) { break; } ps.write(buf, 0, read); } ps.flush(); fis.close(); System.out.println("-----文件传输完成------"); } //接收客户端发送的信息 private void getMessage(DataInputStream inputStream) { try { //本地保存路径,文件名会自动从服务器端继承而来。 String savePath = "D://android_img/"; File file = new File(savePath); // 创建文件夹 if (!file.exists()) { file.mkdirs(); } int bufferSize = 8192; byte[] buf = new byte[bufferSize]; int passedlen = 0; long len=0; savePath = inputStream.readUTF(); DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)))); len = inputStream.readLong(); System.out.println("文件的长度为:" len "\n"); System.out.println("开始接收文件!" "\n" getTime()); while (true) { int read = 0; if (inputStream != null) { read = inputStream.read(buf); } passedlen = read; if (read == -1) { break; } //进度条,如果是大文件,可能会重复打印出一些相同的百分比 System.out.println("文件接收了" (passedlen * 100/ len) "%\n"); fileOut.write(buf, 0, read); } //花费的时间 System.out.println("接收完成,文件存为" savePath "\n" getTime()); fileOut.close(); } catch (Exception e) { System.out.println("接收消息错误" "\n" e.toString()); return; } } public static String getTime(){ long tmp = System.currentTimeMillis();//花费的时间 SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒"); Date date = new Date(tmp); return formatter.format(date); } public static void main(String arg[]) { System.out.println("-----准备建立socket链接----"); new ServerTest().start(); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论