今天写了一个socket的服务器端的程序,但是在接受数据时出现问题,我用sockettool(socket调试工具)发东西过来的时候,只有断开sockettool的时候,服务器这边才能接受到数据,请问这是怎么回事儿,下面是写的代码
import java.io.*;
import java.net.*;
public class AcceptData { /**
 * @param args
 */
public static void main(String[] args) {
AcceptData ad=new AcceptData();
}
  
 public AcceptData()
 {
 try {
ServerSocket ss=new ServerSocket(12345);

System.out.println("正在监听12345端口");

Socket s=ss.accept();

//读取数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);


//读取从客户端发来的信息
String info=br.readLine();

System.out.println(info);


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 }  
 
}

解决方案 »

  1.   

    "还发现个问题就是,在发送数据时,按一下回车,再点儿发送,服务器这边就能接受到了"
    可能原因是, String info=br.readLine();这句是读入一行,而判断是否为一行就是碰到"\r\n",你在发送之前按"回车",正好给行末加了"\r\n".
      

  2.   

    嘿!socket通信,这东西,如果特别感兴趣,多研究一下。
    如果做项目用,apache mina吧。
    虽然我自己会习惯自己写,在项目中出错是少不了的。
    如果你希望你的性能和稳定度更高,先用框架吧。
      

  3.   

    你可以试试其他抓包工具wireshark测试一下,tcpdump,也可以嘛,看看还会出现问题吗。
    可以不用readLine(),重新设置读取判断条件,和输出
      

  4.   

    发送端代码的问题。
    楼主发送数据,没有自定义传输协议,每次传输的信息,基本上是以回车换行符最为区分的。
    所以,客户端不输入回车换行符,就表明本次传输的数据,没有完成,服务端的读取方法持久阻塞。
    其次就是,客户端写入数据后(包括回车换行符),没有调用flush方法,将发送缓存区的数据推到网络上,造成服务端因为没有收到数据而持续阻塞。
      

  5.   

    按照自己需求,写一部分数据后 flush一下。
    或者全部写完后调用flush。
    flush是关键所在
      

  6.   

    LZ可以先看看TCP/IP协议方面的书。