A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kakasa 中级黑马   /  2014-9-29 14:46  /  1539 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();
}

}

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
本帖最后由 kakasa 于 2014-9-29 15:03 编辑

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

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 很给力!

查看全部评分

回复 使用道具 举报
darkads 发表于 2014-9-29 17:04
服务端和客户端的两个循环,发送循环的退出条件是读到null,也就是说这个null不会被发送出去,而服务端退出 ...

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

怪不得只读取一次反馈信息,原来是这样。
回复 使用道具 举报
你放在while里面,客户端那边的readLine就不会被阻塞,客户端运行结束了,服务端自然就结束了。
回复 使用道具 举报
Eagle 高级黑马 2014-9-29 21:10:22
8#
只要是提问题帖子。在这里你永远不要怕沉!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马