客户端:MultiTalkClient.java
------------------------------------------------------------------------------
import java.io.*;
import java.net.*;public class MultiTalkClient {
  public static void main(String args[]) {
    try {
      System.out.println("客户方正准备提交请求......");
      Socket socket = new Socket("127.0.0.1", 2006);
      BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));      PrintWriter os = new PrintWriter(socket.getOutputStream());
      BufferedReader is = new BufferedReader(new InputStreamReader(socket.
          getInputStream()));      String strLine;
      strLine = sin.readLine();
      while (!strLine.equals("bye")) {
        os.println(strLine);
        os.flush();
        System.out.println("客户方说:" + strLine);
        System.out.println("服务方回答:" + is.readLine());
        strLine = sin.readLine();
      }
      os.close();
      is.close();
      socket.close();
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
  }
}
------------------------------------------------------------------------------
服务端MultiTalkServer.java
import java.io.*;
import java.net.*;class ServerThread extends Thread {
  Socket socket = null;
  int num;  public ServerThread(Socket socket, int num) {
    this.socket = socket;
    this.num = num + 1;
  }  public void run() {
    try {
      String strLine;
      BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
      BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      PrintWriter os = new PrintWriter(socket.getOutputStream());      while (! ( (strLine = sin.readLine()).equals("bye"))) {
        os.println(strLine);
        os.flush();
        System.out.println("客户方" + num + "说:" + is.readLine());
        System.out.println("服务方回答客户方:" + num + "说:" + strLine);
      }
      is.close();
      os.close();
      socket.close();
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
  }
}public class MultiTalkServer {
  static int intNum = 0;
  public static void main(String args[]) {
    ServerSocket server = null;
    boolean b = true;
    try {
      System.out.println("服务方正在服务......");
      server = new ServerSocket(2006);
      while (b) {
        Socket socket = server.accept();
        new ServerThread(socket, intNum).start();
        intNum++;
      }
      server.close();
    }
    catch (Exception e) {
      System.out.println(e.toString());
    }
  }
}
------------------------------------------------------------------------------
请教,当服务端程序S运行并监听端口后,首先启动客户端程序A进行输入,然后再在S中输入应答的数据,分别能够在S和A中看到相应的通信数据。但是如果现在再启动客户端程序B进行输入,然后再在S中输入应答的数据,这时就会出现需要输入两行数据才能进行通信的问题,并且我想发往B的数据有时被发往了A,造成了混乱,请指教,谢谢!

解决方案 »

  1.   

    你这样当然会出问题啦,我想你要做的是在服务器端增加一个数据结构来存放连接,并且为每一个客户端建立一个新的连接,例如:Vector list = new Vector();
    try {
          System.out.println("服务方正在服务......");
          server = new ServerSocket(2006);
          while (b) {
            Socket socket = server.accept();
            ServerThread st = new ServerThread(socket).start();
            list.add(st);
          }
          server.close();
        }
    你在为每一个线程确定一个唯一的标识,来确定他的目的地,这样发就不会出错了;
    另,建议你的MultiTalkServer也做成一个线程,方便性能协调.
      

  2.   

    既然已经找到问题所在了,干嘛还要花心思想办法让两个线程去抢输入?难不成你的“服务器程序”将来真的要通过敲键盘来做响应吗?如果真是这样,考虑用 GUI 好了。