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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何拴绪 于 2012-5-26 19:57 编辑

这段代码中文件上传成功了可是阻塞方法还是没有停止,判断标记貌似没有被执行 这么回事?
  1. import java.io.*;
  2. import java.net.*;
  3. class TextClient
  4. {
  5. public static void main(String[] args) throws Exception
  6. {
  7. Socket s = new Socket("127.0.0.1",10005);
  8. BufferedReader br = new BufferedReader(new FileReader("TCPDemo.java"));
  9. String line = null;
  10. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));//老师是这里用的打印流我用的字符流
  11. while((line=br.readLine())!=null) {
  12. bw.write(line);
  13. bw.newLine();
  14. bw.flush();
  15. }
  16. bw.write("over");//结束标记
  17. bw.flush();
  18. BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
  19. System.out.println( brIn.readLine());
  20. br.close();
  21. s.close();
  22. }
  23. }
  24. class TextServer
  25. {
  26. public static void main(String[] args) throws Exception
  27. {
  28. ServerSocket ss = new ServerSocket(10005);
  29. Socket s = ss.accept();
  30. String ip = s.getInetAddress().getHostAddress();
  31. System.out.println(ip);
  32. BufferedWriter bw = new BufferedWriter(new FileWriter("Server.txt"));
  33. BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  34. BufferedWriter bwIn = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

  35. String line = null;
  36. while((line=br.readLine())!=null) {
  37. if("over".equals(line))
  38. break;
  39. bw.write(line);
  40. bw.newLine();
  41. bw.flush();
  42. }
  43. bwIn.write("上传成功");//返回客户端字样
  44. bw.close();
  45. ss.close();
  46. }
  47. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
bw.write("over");//结束标记
bw.neLine();
bw.flush();

你之前都写对了,就知道时候什么原因了,估计是漏写的吧。
对了,既然使用字符流,为什么不用PrintWriter?
回复 使用道具 举报
王硕' 发表于 2012-5-26 18:38
bw.write("over");//结束标记
bw.neLine();
bw.flush();

不是这里的问题,貌似还是不可以,麻烦再帮我分析下
回复 使用道具 举报
本帖最后由 张亭 于 2012-5-26 19:06 编辑

import java.io.*;
import java.net.*;
class TextClient {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 10005);
BufferedReader br = new BufferedReader(new FileReader("TCPDemo.java"));
String line = null;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));// 老师是这里用的打印流我用的字符流
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.write("over");// 结束标记
bw.newLine();//要加上这句
bw.flush();
BufferedReader brIn = new BufferedReader(new InputStreamReader(
s.getInputStream()));
System.out.println(brIn.readLine());
br.close();
s.close();
}
}
class TextServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10005);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip);
BufferedWriter bw = new BufferedWriter(new FileWriter("Server.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
BufferedWriter bwIn = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line))
break;
bw.write(line);
bw.newLine();
bw.flush();
}
bwIn.write("上传成功");// 返回客户端字样
bwIn.newLine();//加上这两句
bwIn.close();
bw.close();
ss.close();
}
}
因为你用的都是readLine()方法,这个方法要读到换行标记才结束
所以要添上对应的newLine()

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
何拴绪 发表于 2012-5-26 19:01
不是这里的问题,貌似还是不可以,麻烦再帮我分析下

。。。 是这个问题。不过没楼上哥们说的完整。
一个是客户端写给服务端的结束符号没加换行符,服务端的读就无法结束,
另外一个是服务端写给客户端的没加换行附,导致客户端的读无法结束。
哥们,还是那句话, 用println()一句话就解决问题胃

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张亭 发表于 2012-5-26 19:02
import java.io.*;
import java.net.*;
class TextClient {

谢谢啊 解决了 可是为什么不关流就不行呢?
回复 使用道具 举报
张晨 黑马帝 2012-5-26 19:36:20
7#
建议使用发送,接收,发送,接收的方式处理,比较明确
然后你的主要错误就是没有刷新字符流,所以client的字符都没有发送出去
我帮你修改了一下,自己对比着看吧
  1. import java.io.*;
  2. import java.net.*;
  3. public class TextClient {

  4.         public static void main(String[] args) throws Exception {
  5.                 Socket s = new Socket("127.0.0.1", 10005);
  6.                 BufferedReader br = new BufferedReader(new FileReader("TCPDemo.java"));
  7.                 String line = null;
  8.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
  9.                                 s.getOutputStream()));// 老师是这里用的打印流我用的字符流
  10.                 BufferedReader brIn = new BufferedReader(new InputStreamReader(
  11.                                 s.getInputStream()));
  12.                
  13.                 while ((line = br.readLine()) != null) {
  14.                         System.out.println( line); //for test
  15.                         bw.write(line);
  16.                         bw.newLine();
  17.                         bw.flush();
  18.                         brIn.readLine();
  19.                 }
  20.                 bw.write("over");// 结束标记
  21.                 bw.newLine();
  22.                 bw.flush();

  23.                 System.out.println(brIn.readLine());
  24.                 br.close();
  25.                 s.close();
  26.         }
  27. }

复制代码
  1. import java.io.*;

  2. import java.net.*;

  3. public class TextServer {

  4.         public static void main(String[] args) throws IOException {

  5.                 ServerSocket ss = new ServerSocket(10005);
  6.                 Socket s = ss.accept();
  7.                 String ip = s.getInetAddress().getHostAddress();
  8.                 System.out.println(ip);
  9.                 BufferedWriter bw = new BufferedWriter(new FileWriter("Server.txt"));
  10.                 BufferedReader br = new BufferedReader(new InputStreamReader(
  11.                                 s.getInputStream()));
  12.                 BufferedWriter bwIn = new BufferedWriter(new OutputStreamWriter(
  13.                                 s.getOutputStream()));
  14.                 String line = null;
  15.                 char[] buff= new char[1024];
  16.                 int len;
  17.                 while ((line = br.readLine()) != null) {
  18.                         if ("over".equals(line))
  19.                                 break;
  20.                         bw.write(line);
  21.                         bw.newLine();
  22.                         //bw.flush();
  23.                         bwIn.write("ok");  //add by zc
  24.                         bwIn.newLine();  //add by zc
  25.                         bwIn.flush();
  26.                        
  27.                 }
  28.                 bwIn.write("上传成功");// 返回客户端字样
  29.                 bwIn.newLine();
  30.                 bwIn.flush();
  31.                 System.out.println("successful");
  32.                 bw.close();
  33.                 ss.close();
  34.         }
  35. }
复制代码
回复 使用道具 举报
张亭 中级黑马 2012-5-26 21:12:42
8#
何拴绪 发表于 2012-5-26 19:21
谢谢啊 解决了 可是为什么不关流就不行呢?

关流的时候会自动flush一下,所以,省略了close()前面的flush()方法;
因为程序结束了,直接写close() 就OK了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马