当前位置: 代码迷 >> Java相关 >> 求助 关于 Socket 的一点小问题
  详细解决方案

求助 关于 Socket 的一点小问题

热度:437   发布时间:2013-09-18 10:30:05.0
求助 关于 Socket 的一点小问题
写了个简单的 客户端发送信息到服务端, 服务端收到后回一信息到客户端 , 可是运行后怎么就卡着不动了??  求指点
这是服务端的代码
程序代码:
import java.io.*;
import java.net.*;
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 java.io.*;
import java.net.*;
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 , 但此时 客户端就出现java.net.SocketException: 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  发送信息  

----------------解决方案--------------------------------------------------------
没人么
----------------解决方案--------------------------------------------------------
话说我也运行了你的代码,一时还真没看出来,就不想懂脑子了,哈哈哈
----------------解决方案--------------------------------------------------------
以下是引用java小蚂蚁在2013-9-18 22:38:31的发言:

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

版版 求指导 自学的苦B青年困扰好几天了
----------------解决方案--------------------------------------------------------
教你一种调试的方法,
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")


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

文章太长,下一层继续。。。
----------------解决方案--------------------------------------------------------
打了监控句子之后,我发现你客户端的 "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 编辑 ]
----------------解决方案--------------------------------------------------------
回复 6楼 scampRa
一段时间没来  看到你回复问题解决了 感谢了
----------------解决方案--------------------------------------------------------
  相关解决方案