甚至在建立连接之后,serversocket.accept()方法也会阻塞

时间:2013-09-09 18:06:23

标签: java tcp

服务器

    public class Server {

class ServerHelper implements Runnable
    {
        InputStream is;
        private InputStreamReader isr;
        private BufferedReader br;

        public ServerHelper(InputStream is) {
            this.is  = is;
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
        }



         private void display() throws IOException {

            String s = "";
            System.out.print("client says : ");
            while ( ( s = br.readLine() ) != null ) {                
                System.out.print(s + " ");
            }
        }

        @Override
        public void run() {
            try {
                display( );
            } catch (IOException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        void start( ) throws Exception{
          ServerSocket ss = new ServerSocket(5555);

             while (true) {            
                System.out.println("waiting for conn..");
              Socket accept =   ss.accept();//code hangs over here and doesn't proceed ahead

                 if( accept == null )
                     System.out.println("got null...");
                 System.out.println("got the client req...");
                 ServerHelper sh = new ServerHelper(accept.getInputStream());
                 Thread t = new Thread(sh);
                 t.start();
             }

        }

         public static void main(String[] args) {
             try {
                // TODO code application logic here
                new Server().start();
             } catch (Exception ex) {
                 Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
         }

客户

public class Client {

void start( ) throws Exception{
    System.out.println("enter window size ");
    Scanner sc = new Scanner(System.in);
    int wsize = sc.nextInt();
    Socket s = new Socket("127.0.0.1", 5555);
    System.out.println("is connected .." + s.isConnected());

    OutputStream outputStream = s.getOutputStream();
    PrintWriter pw = new PrintWriter(outputStream);
    String c  = "y";
    int j = 0;
    do{
        String se = "";
        for (int i = 0; i < wsize; i++) {
            j++;
            se = se + String.valueOf(j);

        }
        pw.println(se);
        pw.flush();

        System.out.println("do u wanna send more....?(y|n)");
        c =  sc.next();
    }while( c.equalsIgnoreCase("y") );

}
public static void main(String[] args) {
    try {
        // TODO code application logic here
        new Client().start();
    } catch (Exception ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

Socket accept =   ss.accept();

这里我的代码挂起我知道它阻止了io,但在客户端我确实验证了客户端是否已连接但是它显示已连接...是什么问题与accept()?我以类似的方式为我的所有TCP应用程序编码,但这很奇怪..可以任何一个帮助

我还为那些想要查看该课程的人添加了ServerHelper代码..

3 个答案:

答案 0 :(得分:0)

查看您的代码:

while (true) {            
      System.out.println("waiting for conn..");
      Socket accept =   ss.accept();
      .................
}

您将ss.accept()调入无限循环。连接客户端accept()后,将返回Socket个实例。然后将此套接字传递给在其自己的线程中运行的服务器帮助程序并返回到ss.accept(),这样您的服务器就可以接受其他客户端了。你的代码看起来不错。很遗憾,您还没有发送ServerHelper的代码,也没有解释您的客户端是否成功将数据发送到服务器,但到目前为止一切看起来还不错。

答案 1 :(得分:0)

如果对accept的调用确实是阻塞,那么你有另一个运行的程序正在侦听5555并且绑定到“127.0.0.1”。您的客户端正在连接到其他程序,因此ss.accept仍会阻止。

解决方案是查找并终止其他进程

其他信息:

由于您未在服务器套接字中指定绑定地址,因此它绑定到“0.0.0.0”(所有接口)。

可以将一个进程绑定到127.0.01,将另一个进程绑定到0.0.0.0(至少在Windows上)。我从tcpview复制了一些数据。第二列是进程ID。

java.exe    5944    TCP 0.0.0.0 5555    0.0.0.0 0   LISTENING                                       
java.exe    5944    TCPV6   [0:0:0:0:0:0:0:0]   5555    [0:0:0:0:0:0:0:0]   0   LISTENING                                       
java.exe    5608    TCP 127.0.0.1   5555    0.0.0.0 0   LISTENING       

我可以使用telnet 10.101.16.28 5555(我的本地IP地址)连接到流程5944,或使用telnet 127.0.0.1 5555连接到流程5608

答案 2 :(得分:0)

当然它阻止了。它正在等待连接。这就是应该做的。 BTW检查accept()的结果为null是没有意义的。它不会为空。可能这是你的错误观念:如果没有传入连接,你是否期望它返回null?它没有这样做。见Javadoc。