socket网络传输实例

编程技术  /  houtizong 发布于 3年前   82
(1)简单实现文件在网络中的传输,要实现高级功能,在此基础上进行修改即可。
分2个类实现,FileSender负责文件发送,FileIncepter负责文件接受:

用socket传输文件本质:发送端:打开文件,将文件中字符串发给接收端;接收端接收字符串,写入文件中即可。

writeLong(long)
将一 long 作为八字节值,写入该基本输出流,高字节优先。
writeShort(int)
将一 short 作为两字节值,写入该基本输出流,高字节优先。
writeUTF(String)
使用独立于机器的 UTF-8 编码格式,将一个串写入该基本输出流。

import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class FileSender {   private ServerSocket ss = null;   public FileSender() {   }   public void startSend(String filePath, int port) {     // socket输出流     DataOutputStream os = null;     // 文件输入流     DataInputStream is = null;     // 建立socket连接     Socket socket = null;     try {       // 选择进行传输的文件       File file = new File(filePath);       // 建立socket监听       ss = new ServerSocket(port);       socket = ss.accept();       os = new DataOutputStream(socket.getOutputStream());       // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,       // 具体可以参见Think In Java 4th里有现成的代码。       os.writeUTF(file.getName());       os.flush();       os.writeLong((long) file.length());       os.flush();       is = new DataInputStream(new BufferedInputStream(           new FileInputStream(filePath)));       // 缓冲区大小       int bufferSize = 8192;       // 缓冲区       byte[] buf = new byte[bufferSize];       // 传输文件       while (true) {         int read = 0;         if (is != null) {           read = is.read(buf);         }         if (read == -1) {           break;         }         os.write(buf, 0, read);       }       os.flush();     } catch (IOException e) {       e.printStackTrace();     } finally {       // 关闭所有连接       try {         if (os != null)           os.close();       } catch (IOException e) {       }       try {         if (is != null)           is.close();       } catch (IOException e) {       }       try {         if (socket != null)           socket.close();       } catch (IOException e) {       }       try {         if (ss != null)           ss.close();       } catch (IOException e) {       }     }   }   public static void main(String[] args) {     new FileSender().startSend("E:\\JDK_API_1_6_zh_CN.CHM", 8821);   } } import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class FileIncepter {   public FileIncepter() {   }   public void getFile(String savePath, String ip, int port) {     // 建立socket连接     Socket socket = null;     try {       socket = new Socket(ip, port);     } catch (UnknownHostException e1) {       e1.printStackTrace();     } catch (IOException e1) {       e1.printStackTrace();     }     // 建立socket输入流     DataInputStream inputStream = null;     try {       inputStream = new DataInputStream(new BufferedInputStream(socket           .getInputStream()));     } catch (IOException e1) {       e1.printStackTrace();     }     try {       // 缓冲区大小       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 + "    KB");       System.out.println("开始接收文件!");       // 获取文件       while (true) {         int read = 0;         if (inputStream != null) {           read = inputStream.read(buf);         }         passedlen += read;         if (read == -1) {           break;         }         System.out.println("文件接收了" + (passedlen * 100 / len) + "%");         fileOut.write(buf, 0, read);       }       System.out.println("接收完成,文件存为" + savePath);       fileOut.close();     } catch (Exception e) {       e.printStackTrace();       return;     }   }   public static void main(String[] args) {     new FileIncepter().getFile("F:\\", "localhost", 8821);   } } (2) 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。废话少说,先来看服务器端的程序。 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerTest {         int port = 8821;         void start() {                 Socket s = null;                 try {                         ServerSocket ss = new ServerSocket(port);                         while (true) {                                 // 选择进行传输的文件                                 String filePath = "D:\\lib.rar";                                 File fi = new File(filePath);                                 System.out.println("文件长度:" + (int) fi.length());                                 // public Socket accept() throws                                 // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。                                 s = ss.accept();                                 System.out.println("建立socket链接");                                 DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));                                 dis.readByte();                                 DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));                                 DataOutputStream ps = new DataOutputStream(s.getOutputStream());                                 //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。                                 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();                                 // 注意关闭socket链接哦,不然客户端会等待server的数据过来,                                 // 直到socket超时,导致数据不完整。                                                                fis.close();                                 s.close();                                                                System.out.println("文件传输完成");                         }                 } catch (Exception e) {                         e.printStackTrace();                 }         }         public static void main(String arg[]) {                 new ServerTest().start();         } } 


2.socket的Util辅助类

package sterning; 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 sendMessage) throws Exception {                 try {                         out = new DataOutputStream(socket.getOutputStream());                         if (sendMessage.equals("Windows")) {                                 out.writeByte(0x1);                                 out.flush();                                 return;                         }                         if (sendMessage.equals("Unix")) {                                 out.writeByte(0x2);                                 out.flush();                                 return;                         }                         if (sendMessage.equals("Linux")) {                                 out.writeByte(0x3);                                 out.flush();                         } else {                                 out.writeUTF(sendMessage);                                 out.flush();                         }                 } catch (Exception e) {                         e.printStackTrace();                         if (out != null)                                 out.close();                         throw e;                 } finally {                 }         }         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) {                 }         } } 3.客户端 package sterning; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; public class ClientTest {         private ClientSocket cs = null;         private String ip = "localhost";// 设置成服务器IP         private int port = 8821;         private String sendMessage = "Windwos";         public ClientTest() {                 try {                         if (createConnection()) {                                 sendMessage();                                 getMessage();                         }                 } catch (Exception ex) {                         ex.printStackTrace();                 }         }         private boolean createConnection() {                 cs = new ClientSocket(ip, port);                 try {                         cs.CreateConnection();                         System.out.print("连接服务器成功!" + "\n");                         return true;                 } catch (Exception e) {                         System.out.print("连接服务器失败!" + "\n");                         return false;                 }         }         private void sendMessage() {                 if (cs == null)                         return;                 try {                         cs.sendMessage(sendMessage);                 } catch (Exception e) {                         System.out.print("发送消息失败!" + "\n");                 }         }         private void getMessage() {                 if (cs == null)                         return;                 DataInputStream inputStream = null;                 try {                         inputStream = cs.getMessageStream();                 } catch (Exception e) {                         System.out.print("接收消息缓存错误\n");                         return;                 }                 try {                         //本地保存路径,文件名会自动从服务器端继承而来。                         String savePath = "E:\\";                         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");                                                                 while (true) {                                 int read = 0;                                 if (inputStream != null) {                                         read = inputStream.read(buf);                                 }                                 passedlen += read;                                 if (read == -1) {                                         break;                                 }                                 //下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比                                 System.out.println("文件接收了" +    (passedlen * 100/ len) + "%\n");                                 fileOut.write(buf, 0, read);                         }                         System.out.println("接收完成,文件存为" + savePath + "\n");                         fileOut.close();                 } catch (Exception e) {                         System.out.println("接收消息错误" + "\n");                         return;                 }         }         public static void main(String arg[]) {                 new ClientTest();         } } 
这就实现了从服务器端向客户端发送文件的过程,当然,反过来,也一样.稍有不同.代码中对跨平台的细节没有实现,有时间或兴趣的朋友可以提供一下

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客