标题:求助 关于 Socket 的一点小问题
只看楼主
灵想
Rank: 2
等 级:论坛游民
帖 子:23
专家分:16
注 册:2012-9-3
结帖率:66.67%
已结贴  问题点数:20 回复次数:6 
求助 关于 Socket 的一点小问题
写了个简单的 客户端发送信息到服务端, 服务端收到后回一信息到客户端 , 可是运行后怎么就卡着不动了??  求指点
这是服务端的代码
程序代码:
import *;
import *;
public class TServerSocket{
    public static void main(String args[]) throws Exception{
      BufferedReader br = null;  //建立输入管道
      OutputStreamWriter osw = null; // 建立输出管道
      ServerSocket ss = new ServerSocket(6678);
      String s1 = null;
      while (true){
         Socket s = ss.accept();
         System.out.println("is connect");
         br = new BufferedReader(new InputStreamReader(s.getInputStream() ) );    
       osw = new OutputStreamWriter(s.getOutputStream() );
         System.out.println(br.readLine() );   // 读取客户端的信息
         try {        
           osw.write("hihi");                  // 写信息到客户端
           osw.flush();
           osw.close();
         } catch (IOException ie){
            ie.printStackTrace();
         } 
         
         br.close();         
         s.close();
         
      }
    }
} 


这是 客户端的代码
程序代码:
 import *;
import *;
public class TSocket{
    public static void main(String args[]) throws Exception{
      OutputStreamWriter osw = null;
      BufferedReader br = null;      
      Socket s = new Socket("127.0.0.1",6678);
      osw = new OutputStreamWriter(s.getOutputStream() );       // 建立输出管道
      br = new BufferedReader(new InputStreamReader(s.getInputStream() ) );     //建立输入管道      
      osw.write("hello");
      osw.flush();
      // 我把osw.close(); 放这 服务端可以打印出hello , 但此时 客户端就出现 socket closed 这样的异常  什么意思? 
          
    try {
        
        System.out.println(br.readLine() );
        System.out.println("测试是否接收到服务端信息" );
        
    } catch (IOException ie){
        ie.printStackTrace();
    }
      osw.close();
      br.close();      
      s.close();
    }
}


[ 本帖最后由 灵想 于 2013-9-18 10:32 编辑 ]
搜索更多相关主题的帖子: 客户端 服务端 Socket 发送信息 
2013-09-18 10:30
灵想
Rank: 2
等 级:论坛游民
帖 子:23
专家分:16
注 册:2012-9-3
得分:0 
没人么
2013-09-18 18:40
java小蚂蚁
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:上海
等 级:贵宾
威 望:18
帖 子:558
专家分:2186
注 册:2013-7-2
得分:10 
话说我也运行了你的代码,一时还真没看出来,就不想懂脑子了,哈哈哈

学海无涯#¥%……&*(
2013-09-18 22:38
灵想
Rank: 2
等 级:论坛游民
帖 子:23
专家分:16
注 册:2012-9-3
得分:0 
以下是引用java小蚂蚁在2013-9-18 22:38:31的发言:

话说我也运行了你的代码,一时还真没看出来,就不想懂脑子了,哈哈哈

版版 求指导 自学的苦B青年困扰好几天了
2013-09-18 23:18
scampRa
Rank: 2
等 级:论坛游民
帖 子:6
专家分:30
注 册:2013-9-8
得分:10 
教你一种调试的方法,
1 在服务器端的这一句System.out.println(br.readLine());
  前面加一句System.out.println("1");
2 然后在这一句osw.write("hihi");
  前面加一句System.out.println("2");

同样,在客户端那里
1 在这一句osw.write("world");
  前面加一句System.out.println("1");
2 在这一句osw.flush();
  后面加一句System.out.println("2");
3 在这一句System.out.println(br.readLine());
  前面加一句System.out.println("3")


加这些的句子的作用时,帮助你监控程序输出到哪一步了。

文章太长,下一层继续。。。
2013-09-19 23:22
scampRa
Rank: 2
等 级:论坛游民
帖 子:6
专家分:30
注 册:2013-9-8
得分:0 
打了监控句子之后,我发现你客户端的 "world" 成功发送出去了,而服务器端却没有接受到,于是
程序就在服务器端的这一句 System.out.println(br.readLine()); 这里停住了,不再往下执行。

原因解释:你客户端输出的是"world" 虽然你flush了一下buffer,字符串成功发送出去了,
但是你注意,你服务器端接收的句子是这个System.out.println(br.readLine());
这个方法是从输入流中读取一行字符串,以换行符为结束标志。重点是,你发送的是"world",换行符缺失了,
于是服务器端的realLine()方法就一直在等待你的换行符。

解决方法:非常简单,在客户端的输出中那个"world" 改成 "world\n"


另外,至于你说在客户端flush()后关闭输出流能解决输出问题
原因:你关闭了输出流,那么buffer里的就是一行字符串了,"world" 就变成了"world\n",它自动帮你加上换行符了。
至于报错原因,假如你在flush()后面直接来一句close(),建议你在写close()方法前面和后面添加这个两句
System.out.println(s.isConnected());
System.out.println(s.isClosed());
相信你看到打印的结果就明白了。

[ 本帖最后由 scampRa 于 2013-9-19 23:49 编辑 ]
2013-09-19 23:38
灵想
Rank: 2
等 级:论坛游民
帖 子:23
专家分:16
注 册:2012-9-3
得分:0 
回复 6楼 scampRa
一段时间没来  看到你回复问题解决了 感谢了
2013-10-02 14:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-420713-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.261713 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved