不单只是java这样,我用过的C,delphi都是这样的,而且,如果可以双方互相通信的话,需要两个线程。因为既要你随时可以发送信息,又不影响接受信息,只有分开两个线程。我不知道你想问哪一个时刻socket是不是阻塞的,如果你写过socket的程序,你可以看到一定有一个accept(服务器端),一个connect(客户端)(java,c,delphi都是这样)。在accept这一步
是租塞的,如果没有客户端连接,服务器端不会工作(指socket这一个线程)。所以,如果你多个连接一个线程的话,那么一个连接过来后,服务器要么不能接下一个连接,要么到了accept阻塞掉了,当前操作做不了。

解决方案 »

  1.   

    java的socket传输是阻塞的
    accept()
    receive()
    都是阻塞方法可以设置setSoTimeOut()
    这样阻塞一定时间就抛出异常socket.setSoTimeOut(1000); // 1秒
    try
    {
        socket.receive(dp);
    }
    catch(Exception e) // 如果一秒钟内没有收到数据包就产生异常
    // 这样就不会永久阻塞
    {
    }
    finally
    {
      socket.close();
    }
      

  2.   

    看看Java网络编程与分布式计算那本书吧
      

  3.   

    你也可以用udp,但不保证安全,速度是很快,如果安全性不是要求很高的话可以考虑用他。
      

  4.   

    呵呵,我想这个和JAVA没关系吧。应该是和TCP协议的连接有关系的。去看TCP协议更有帮助吧。
      

  5.   

    to caoxmby(一切都变得没有意义..........) :
    java的网络编程里能用线程池吗?
    线程池的前提是能够有网络事件触发,让吼道线程池中找个线程去读,但是java里要怎么知道什么时候数据到啊?
    最后也只能每个客户一个线程让他慢慢等不是?
      

  6.   

    java有了新的net io在java.nio.*一个线程可以同时处理无数个请求
      

  7.   

    to asklxf(xuefeng)
    在那里可以下载?
      

  8.   

    nio的资料好像很少阿
    如果我用非阻塞的话,会不会读不完或者发不完就返回?