background image

  其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是 Socket 本身.而服
务器通过 accept 方法就是同意和客户建立通讯.这样当客户建立 Socket 的同时.服务器也会
使用这一根连线来先后通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程
序可以变为如下:
  服务器:
  import java.io.*;
  import java.net.*;
  

public

 

class

 MyServer {

  

public

 

static

 void main(String[] args) throws IOException{

  ServerSocket server=

new

 ServerSocket(5678);

  

while

(true){

  Socket client=server.accept();
  BufferedReader in=

new

 BufferedReader(

new

 InputStreamReader(client.getInputStream()));

  PrintWriter out=

new

 PrintWriter(client.getOutputStream());

  

while

(true){

  String str=in.readLine();
  System.out.println(str);
  out.println("has receive....");
  out.

flush

();

  

if

(str.equals("end"))

  

break

;

  }
  client.close();
  }
  }
  }
 
  这里仅仅只是加了一个外层的 While 循环.这个循环的目的就是当一个客户进来就为
它分配一个 Socket 直到这个客户完成一次和服务器的交互,这里也就是接受到客户
的"End"消息.那么现在就实现了多客户之间的交互了.但是.问题又来了.这样做虽然解决了
多客户,可是是排队执行的.也就是说当一个客户和服务器完成一次通讯之后下一个客户才
可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又
能同时交流呢?很显然这是一个并行执行的问题了.所以线程是最好的解决方案.
  那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连
线取得联系.然后由线程来执行刚才的操作.要创建线程要么直接继承 Thread 要么实现
Runnable 接口,要建立和 Socket 的联系只要传递引用就可以了.而要执行线程就必须重写
run 方法.而 run 方法所做的事情.就是刚才单线程版本 main 所做的事情.因此我们的程序变
成了这样:
  import java.net.*;
  import java.io.*;
  

public

 

class

 MultiUser 

extends

 Thread{

  

private

 Socket client;

  

public

 MultiUser(Socket c){

  this.client=c;