当前位置: 代码迷 >> J2SE >> 为啥使用Socket传送文件时总是会丢失数据,请大神帮忙看一下
  详细解决方案

为啥使用Socket传送文件时总是会丢失数据,请大神帮忙看一下

热度:34   发布时间:2016-04-23 20:29:54.0
为什么使用Socket传送文件时总是会丢失数据,请大神帮忙看一下!
先上代码:

import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;

class  PicClient{
public static void main(String[] args){
//创建本地Socket服务,并连接服务器。
String serverIP = null;
Socket so = null;
try{
serverIP = InetAddress.getLocalHost().getHostAddress();
so = new Socket(serverIP, 23235);
}
catch(UnknownHostException e1){
throw new RuntimeException("无法确定服务器IP地址!");
}
catch(IOException e2){
throw new RuntimeException("连接服务器失败!");
}
System.out.println("成功连接至"+serverIP+"服务器。");

//向服务器发送文件名。
File file = null;
OutputStream out = null;
DataOutputStream soDos = null;
try{
out = so.getOutputStream();
soDos = new DataOutputStream(out);
file = new File("D:\\java_samples\\23rd_day\\files\\7.jpg");

soDos.writeUTF(file.getName());
soDos.flush();
}
catch (IOException e){
throw new RuntimeException("获取本地Socket服务输出流失败,或者未与服务器连接!");
}

//发送文件
BufferedInputStream soBis = null;
BufferedOutputStream soBos = null;
try{
soBis = new BufferedInputStream(new FileInputStream(file));
soBos = new BufferedOutputStream(so.getOutputStream());
byte[] buf = new byte[1024*5];
int len = 0;

while((len = soBis.read(buf, 0, 1024*5)) != -1){
soBos.write(buf, 0, len);
}
}
catch (IOException e){
throw new RuntimeException("读取文件时发生异常,或者向Socket流中写入数据时出现异常");
}
finally{
try{
if(soBis != null)
soBis.close();
}
catch (IOException e){
throw new RuntimeException("文件读取流关闭失败!");
}
}

//关闭本地Socket写入流,并向服务器发送结束标记,便于停止接收循环
try{
so.shutdownOutput();
}
catch (IOException e){
throw new RuntimeException("关闭本地Socket服务写入流失败!");
}

//接受服务器发送的上传成功信息
DataInputStream soDis = null;
try{
soDis = new DataInputStream(so.getInputStream());

System.out.println(soDis.readUTF());
}
catch (IOException e){
throw new RuntimeException("获取本地Socket读取流失败,或者接受服务器信息失败!");
}

try{
so.close();
}
catch (IOException e){
throw new RuntimeException("关闭本地Socket服务失败!");
}
}
}

class PicServer{
public static void main(String[] args){

//创建服务器端ServerSocket服务,并与客户端连接,获取客户端Socket服务对象。
ServerSocket ss = null;
Socket so = null;
try{
ss = new ServerSocket(23235);
so = ss.accept();
System.out.println(so.getInetAddress().getLocalHost().getHostAddress()+" 成功连接本机。");
}
catch (UnknownHostException e1){
throw new RuntimeException("无法获取客户端IP地址!");
}
catch(IOException e2){
throw new RuntimeException("创建服务器ServerSocket服务失败,或者未能接收客户端Socket服务对象!");
}

//接收客户端发送的文件名,并添加时间创建该文件。
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String time = sdf.format(date);
InputStream in = null;
DataInputStream dis = null;
File file = null;
try{
in = so.getInputStream();
dis = new DataInputStream(in);
String fileName = dis.readUTF();
System.out.println(fileName);
file = new File("D:\\java_samples\\23rd_day\\files", time+"_"+fileName);
if(!file.exists())
file.createNewFile();
}
catch (IOException e){
throw new RuntimeException("获取客户端Socket读取流失败,或者文件创建失败!");
}

//接收文件
BufferedInputStream soBis = null;
BufferedOutputStream bos = null;
byte[] buf = new byte[1024*5];
int len = 0;
try{
soBis = new BufferedInputStream(so.getInputStream());
bos = new BufferedOutputStream(new FileOutputStream(file));
while((len = soBis.read(buf, 0, 1024*5)) != -1){
bos.write(buf, 0, len);
}
}
catch (IOException e){
throw new RuntimeException("客户端Socket服务读取流读取数据失败,或者文件数据写入失败!");
}
finally{
try{
if(bos != null)
bos.close();
}
catch (IOException e){
throw new RuntimeException("文件写入流关闭失败!!");
}
}

//向客户端发送上传成功信息。
OutputStream out = null;
DataOutputStream soDos = null;
try{
out = so.getOutputStream();
soDos = new DataOutputStream(out);
soDos.writeUTF("上传成功!");
soDos.flush();
}
catch (IOException e){
throw new RuntimeException("获取客户端Socket写入流失败!");
}
  相关解决方案