黑马程序员技术交流社区
标题:
为什么我TCP丢失数据了???
[打印本页]
作者:
wygsqsj
时间:
2015-12-8 22:27
标题:
为什么我TCP丢失数据了???
求大神帮忙分析下,为什么我在TCP传输的时候先把文件名传给服务端,然后再把文件上传到服务端时会出现数据丢失的情况啊,是因为我开了两次输出流的缘故么?我把第一次写文件名的几行去掉后文件就完整了,为什么???
客户端是:
package edu.heima.tcptest3;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
/*
* 上传MP3文件,客户端
* 1.建立客户端
* 2.建立字节读取流获取本地的MP3文件
* 3.获取Socket中的输出流,把本地文件写入到输出流中
* 4.获取Socket输入流,得到服务端反馈数据
* 5.关闭资源
* */
public class Client {
public static void main(String[] args)throws Exception {
//建立Socket客户端
Socket s = new Socket("127.0.0.1",8889);
//告诉服务器文件的名称
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("那个女孩.mp3");
//获取本地文件,通过字节流
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("d://音乐//那个女孩.mp3"));
//获取输出流
OutputStream ps = s.getOutputStream();
//将获取到文件数据写入到输出流中
byte[] buf = new byte[1024];
int len = 0;
while((len = bis.read(buf))!=-1)
{
ps.write(buf, 0, len);
}
//写入结束标记
s.shutdownOutput();
//获取输入流
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
//关资源
bis.close();
s.close();
}
}
复制代码
服务端是:
package edu.heima.tcptest3;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 并发上传文件,服务端
* 1.建立服务端,获取客户端对象
* 2.每获取到一个客户端对象就开启一条线程
* 3.在线程类中封装一下内容
* 首先获取到文件名字
* 获取客户端对象的输入流,读取数据
* 建立新的输出流,将Socket中的数据写入到本地磁盘
* 完成后关闭客户端对象
* */
//定义一个线程类
class PicThread implements Runnable{
//接收一个客户端对象
private Socket s;
PicThread(Socket s)
{
this.s = s;
}
public void run()
{
//获取客户端ip
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"run time...");
try {
//获取文件名字
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
String fileName = br.readLine();
//获取客户端对象的输入流
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
//建立输出流,写入到本地磁盘中
PrintStream ps = new PrintStream(new FileOutputStream("e://"+fileName));
//读取客户端中的数据,写入到指定的文件中
byte[] buf = new byte[1024];
int len = 0;
while((len = bis.read(buf))!=-1)
{
ps.write(buf, 0, len);
}
//反馈信息给服务端
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("数据上传成功!");
//关闭资源
s.close();
ps.close();
} catch (Exception e) {
throw new RuntimeException(ip+"上传失败!");
}
}
}
public class Server {
public static void main(String[] args)throws Exception {
//服务端一般不关闭,通过accept阻塞式方法来获取连接建立的客户端
//建立服务端
ServerSocket ss = new ServerSocket(8889);
while(true)
{
//获取客户端
Socket s = ss.accept();
//每获取到一个客户端就开启一条线程
new Thread(new PicThread(s)).start();
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2