黑马程序员技术交流社区

标题: 关于TCP复制文件代码 [打印本页]

作者: kakasa    时间: 2014-9-29 14:46
标题: 关于TCP复制文件代码
本帖最后由 kakasa 于 2014-9-29 15:02 编辑

class Client {

public static void main(String[] args) throws Exception
{
Socket s=new Socket("192.168.1.102",10000);

BufferedReader br=new BufferedReader(new FileReader("D:\\test.txt"));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
BufferedReader FBbr=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=br.readLine())!=null)
{
out.println(line);
}

System.out.println(FBbr.readLine());
br.close();
FBbr.close();
s.close();
}

}
class Server {
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println("connect to>>"+ip);

BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(new FileWriter("D:\\test_copy.txt"),true);
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;

while((line=br.readLine())!=null)
{
pw.println(line);
out.println("Upload Success");/*这个语句放在while循环内,不加结束标记程序可以正常复制文件并退出,为什么?
                                               如果放在外面,毕老师说readLine方法还在等读取,为什么?*/

}

br.close();
ss.close();
}

}

作者: kakasa    时间: 2014-9-29 14:48
本帖最后由 kakasa 于 2014-9-29 15:03 编辑

代码区怎么显示不全啊。。
作者: kakasa    时间: 2014-9-29 15:04
来人帮忙看一下
作者: kakasa    时间: 2014-9-29 15:17
别沉 别沉。。
作者: darkads    时间: 2014-9-29 17:04
服务端和客户端的两个循环,发送循环的退出条件是读到null,也就是说这个null不会被发送出去,而服务端退出循环的条件是接收到一个null,所以如果客户端不发送一个结束标记,服务端是无法退出循环的
如果将out.println("Upload Success");放在服务端循环里面,那么客户端文件传输完毕,退出循环,等待服务端的返回信息时,客户端就能接收到返回信息,接着Socket流就关闭,程序退出,而socket流的关闭之前会发送一个结束标记,那么服务端接收到了,退出循环,上传完成
上面看似解决了问题,但是服务端每接收一行文本都会向客户端发送一句"Upload Success",但是这个信息只有客户端文件传输完毕后才会收到,而且只会读取最早的一条,其他的都是无用的数据。可以在关闭客户端的socket之前,加个一个FBbr.readLine()死循环,你就能看到很多行的"Upload Success",而且服务端的循环也不会退出
所以最好的方法是在客户端文件传输完成后,手动的使用shutDownOutput()发送一个结束标记


作者: kakasa    时间: 2014-9-29 20:29
darkads 发表于 2014-9-29 17:04
服务端和客户端的两个循环,发送循环的退出条件是读到null,也就是说这个null不会被发送出去,而服务端退出 ...

十分感谢,唯一的一个回复这么有营养。

怪不得只读取一次反馈信息,原来是这样。
作者: 哈达洋    时间: 2014-9-29 21:06
你放在while里面,客户端那边的readLine就不会被阻塞,客户端运行结束了,服务端自然就结束了。
作者: Eagle    时间: 2014-9-29 21:10
只要是提问题帖子。在这里你永远不要怕沉!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2