呵呵,还是用消息吧。在大厅里设一组信箱,每个socket一个箱子。
你总得知道你对家的信箱号吧?然后往里头塞消息就是了,而
你对家的socket每做一次while循环,就检查自己的信箱,消息不就
传递过去了么。

解决方案 »

  1.   

    给你一个管道通信的例子:
    core in java2
    即JAVA2核心技术第2卷55页管道通信的例子/**
     * @version 1.20 1999-04-23
     * @author Cay Horstmann
     */import java.util.*;
    import java.io.*;public class PipeTest
    {  public static void main(String args[])
       {  try
          {  /* set up pipes */
             PipedOutputStream pout1 = new PipedOutputStream();
             PipedInputStream pin1 = new PipedInputStream(pout1);         PipedOutputStream pout2 = new PipedOutputStream();
             PipedInputStream pin2 = new PipedInputStream(pout2);         /* construct threads */         Producer prod = new Producer(pout1);
             Filter filt = new Filter(pin1, pout2);
             Consumer cons = new Consumer(pin2);         /* start threads */         prod.start();
             filt.start();
             cons.start();
          }
          catch (IOException e){}
       }
    }class Producer extends Thread
    {  public Producer(OutputStream os)
       {  out = new DataOutputStream(os);
       }   public void run()
       {  while (true)
          {  try
             {  double num = rand.nextDouble();
                out.writeDouble(num);
                out.flush();
                sleep(Math.abs(rand.nextInt() % 1000));
             }
             catch(Exception e)
             {  System.out.println("Error: " + e);
             }
          }
       }   private DataOutputStream out;
       private Random rand = new Random();
    }class Filter extends Thread
    {  public Filter(InputStream is, OutputStream os)
       {  in = new DataInputStream(is);
          out = new DataOutputStream(os);
       }   public void run()
       {  for (;;)
          {  try
             {  double x = in.readDouble();
                total += x;
                count++;
                if (count != 0) out.writeDouble(total / count);
             }
             catch(IOException e)
             {  System.out.println("Error: " + e);
             }
          }
       }   private DataInputStream in;
       private DataOutputStream out;
       private double total = 0;
       private int count = 0;
    }class Consumer extends Thread
    {  public Consumer(InputStream is)
       {   in = new DataInputStream(is);
       }   public void run()
       {  for(;;)
          {  try
             {  double avg = in.readDouble();
                if (Math.abs(avg - old_avg) > 0.01)
                {  System.out.println("Current average is " + avg);
                   old_avg = avg;
                }
             }
             catch(IOException e)
             {  System.out.println("Error: " + e);
             }
          }
       }   private double old_avg = 0;
       private DataInputStream in;
    }
      

  2.   

    不阻塞的IO是有的,jdk1.4新增的,java.nio.*;
      

  3.   

    一般情况下,每个连接是要开两个线程的,一个发送,一个接收。
    否则,如果一个线程,象你这情况,就是用了什么管道技术也是没有用的。非阻塞的IO倒是可以节省线程,甚至可以所有的连接都用一个线程。java的非阻塞IO没用过,不知道性能咋样。后者的编程方式是消息驱动的。如果所有连接都用一个线程,程序就比较容易写,可以省去资源同步的麻烦。对于消息响应比较快,连接不多的程序(响应时间*连接数=毫秒级),这样写比较好。一些大的服务程序,如:J2EE Application Server,都用前者,即阻塞IO,
    java 的socket过去是没有非阻塞IO的,但即使有了,也不会都在一个线程里处理的。考虑线程过多而消耗的系统资源,有可能由原来的每个连接两个线程改成每个连接一个线程比较合理。
      

  4.   

    多谢大家的回答。不过还有一些不明白
    to hello_wyq(半瓶墨水):register是什么啊?我在jdk doc中找不到
    to  foulong(龙行天下):还是用消息吧。在大厅里设一组信箱
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          这要涉及什么类,能简单说一下怎么做吗?
                          java里能够自己定义消息吗?
    to alphazhao(绿色咖啡):可是程序中事先不知道哪两个线程之间要有管道啊?
    to taolei(实在无聊):每个连接是要开两个线程的,一个发送,一个接收。
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        可是这样的话,怎么在这两个线程间通信呢?
                        而且收发都各做各的,怎么控制通讯规程呢?我感到不知道怎么处理的情况是这样的:
        两个服务线程各自在与客户端交互,但这个时候又要处理可能的相互之间的通讯,问题是服务进程在读对应的客户端输入的时候会阻塞,这个时候另一个服务进程就不能与它通讯了?这应该怎么处理呢?
      

  5.   

    dimstar(塞浦路斯的幽灵) :握手握手,再完不成就要被pk了
      

  6.   

    针对一个简单的下棋程序,每个连接只需要建立一个接收线程就可以了,需要发送数据时,可以在任何线程里向任何连接发送数据就行了。这样做潜在的问题是如果发送数据时发生了阻塞,那么这个线程就要停下来等待。但对于简单的下棋程序这个问题可以忽略。至于所有客户连接的所有数据,都通过共享的方式读写就可以了。如果你用到了wait/notify的方式,当前线程就必须停下来,所以用到wait/notify的线程应该是独立的提供单一服务的线程。即:它wait的时候就应该是它无事可做的时候。