其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是 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;