基于socket的Java文件传输的程序
2016-02-21 11:20
633 查看
1:客户端程序
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
}
2:服务器端程序
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
}
3:总结:在写的过程中遇到一个致命的问题就是把fileOutputStream.write(bt,0,length);写成了fileOutputStream.write(bt),这样就会使得收到的文件比原来的文件打好几倍。
而且,文件复制或者是文件网络传输基本上都是使用“字节流 + 字符数组”的形式来传输。确保不会乱码和丢失。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) { int longth = 0; try { Socket socket = new Socket("127.0.0.1",4700); //首先获得文件输入流 FileInputStream fileInputStream = new FileInputStream("D:/一般的软件/Thunder_7.9.42.5050Preview.exe"); //再获得文件输出流 OutputStream outputStream = socket.getOutputStream(); byte[] bt = new byte[1024000]; while((longth = fileInputStream.read(bt)) > 0){ **/** * 这句话outputStream.write(bt,0,longth)非常重要,不能够直接写成outputStream.write(bt)把整个数组给传送过去, * 因为上面的read方法最后一次并不能够全部写满整个数组 * 也就是说,你写入了多少就传输多少 */** outputStream.write(bt,0,longth); outputStream.flush(); } fileInputStream.close(); outputStream.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
2:服务器端程序
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) { ServerSocket serverSocket = null; Socket acceptClient = null; try { serverSocket = new ServerSocket(4700); acceptClient = serverSocket.accept(); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("创建服务器端失败,或者监听失败"); } try { InputStream inputStream = acceptClient.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream("D:/一般的软件/迅雷7/Thunder_7.9.42.5050Preview.exe"); byte[] bt = new byte[1024000]; int length = 0; double count = 0; System.out.println("开始接收接收接收接收数据"); while((length = inputStream.read(bt)) > 0){ */** * 这句话outputStream.write(bt,0,longth)非常重要,不能够直接写成outputStream.write(bt)把整个数组给传送过去, * 因为上面的read方法并不能够确保每次都能写满整个数组 * 也就是说,你存多少进数组,就取多少写入文件 */* fileOutputStream.write(bt,0,length); fileOutputStream.flush(); count += length; System.out.println("接收了::" + count + "字节"); } inputStream.close(); fileOutputStream.close(); acceptClient.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
}
3:总结:在写的过程中遇到一个致命的问题就是把fileOutputStream.write(bt,0,length);写成了fileOutputStream.write(bt),这样就会使得收到的文件比原来的文件打好几倍。
而且,文件复制或者是文件网络传输基本上都是使用“字节流 + 字符数组”的形式来传输。确保不会乱码和丢失。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Linux socket 初步
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序