Java中的实际情况是 监听线程阻塞,我想你也可以认为这算是一种Notify机制,因为该端口一有数据系统就会唤醒该监听线程。不过这意味着你需要启动上百个线程分别监听上百个Socket能问问为什么要监听上百个Socket吗?

解决方案 »

  1.   

    可以借用  Observer 和 Observable 这两个观察器完成
      

  2.   

    这个很简单,一个循环接受socket请求,当遇到请求,就创建一个线程处理添加到链表里
      

  3.   

    to:LDH202(玲海) 
    我要写一个程序接收并处理数百个终端传过来的数据﹐终端器是一个简单的仪器﹐每个终端内部集成有一个Server Socket,它有固定的端口号﹐只要给每个终端设置一个ip就可以用Socket连上去了
      

  4.   

    请教"在web页面上实现录音功能"?
      

  5.   

    由于我对Java并不太熟悉﹐能不能举个简单的例子啊﹐谢了
      

  6.   

    嗯,这是终端的条件限制了你的发挥那么,理论上你需要启动n个线程来分别负责每个终端的连接,并用read来等待Server的信息同时阻塞自己不过你也不用担心这会带来很大的负荷,一两百个监听线程还是没有问题的
      

  7.   

    Java 的Socket有消息机制,必须使用 NIO ,这就是基于消息机制的 Socket ,不使用线程机制.给你一个使用 NIO 的时间服务器的例子://file:TimeServer.java
    import java.io.*;
    import java.net.*;
    import java.nio.channels.*;
    import java.nio.*;
    import java.util.*;
    /**
     *一个使用 NIO 的时间服务器.
     */
    public class TimeServer {
    int port = 8001;
    Selector selector = null;
    ServerSocket serverSocket = null;
    ServerSocketChannel serverChannel = null;
    ByteBuffer message = ByteBuffer.allocate(1024);
    public TimeServer() {
    initServer();
    }
    public TimeServer(int port) {
    this.port = port;
    initServer();
    }
    public void initServer() {
    try {
    serverChannel = ServerSocketChannel.open();
    serverSocket = serverChannel.socket();
    serverChannel.configureBlocking(false);
    SocketAddress address = new InetSocketAddress(port);
    serverSocket.bind(address);
    selector = Selector.open();
    serverChannel.register( selector, SelectionKey.OP_ACCEPT );
    } catch (IOException ioe) {
    ioe.printStackTrace();
    }
    }
    public void startServer() throws IOException{
    while(true) {
    if(selector.select()==0) continue;
    Set readyKeys = selector.selectedKeys();
    Iterator ite = readyKeys.iterator();
    while (ite.hasNext()) {
    SelectionKey oneKey = (SelectionKey)ite.next();

    if (oneKey.isAcceptable()) {
    Socket socket = serverSocket.accept();
    SocketChannel clientChannel = socket.getChannel();
    clientChannel.configureBlocking( false );
    clientChannel.register( selector, SelectionKey.OP_WRITE );
    ite.remove();
    }else{
    if (oneKey.isWritable()) {
    SocketChannel ch = (SocketChannel)oneKey.channel();
    ite.remove();
    message.clear();
    message.put(GDateTime4DB.getDateString_Cn(new Date()).getBytes());
    message.flip();
    ch.write(message);
    oneKey.cancel();
    ch.close();
    }
    }
    }
    }
    }

    public static void main(String args[]) {
    TimeServer ts = new TimeServer();
    try {
    ts.startServer();
    } catch(IOException ioe) {
    ioe.printStackTrace();
    }
    }
    }
      

  8.   

    ibm dw开发者论坛有个nio教程。 基于Selector消息选择机制 消息到来的时候 都是无阻塞的
      

  9.   

    To  abcdhy(程旭) 
    我想可能是我误解了楼主的意思,但是
    “小弟要写一个和上百个Server Socket连接的程序”
    应该是说,本地只能是客户端,需要主动的连接到上百个Server上,并等待Server的消息。
    而你的程序似乎是一个服务端不好意思,本人网络个不太是很懂,请稍微解释一下
      

  10.   

    TO stevenmo(凯) :怎么用这观察器啊?能不能说的具体点。 Socket下接收数据时Notify只能用NIO吗? 学习中