基于socket的Java网络编程集粹
if(str.equals(end))
break;
}
client.close();
}
}
}
这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的End消息.那么现在就实现了多客户之间的交互了。但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。
那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:
importjava.net.*;
importjava.io.*;
publicclassMultiUserextendsThread{
privateSocketclient;
publicMultiUser(Socketc){
this.client=c;
}
publicvoidrun(){
try{
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
PrintWriterout=newPrintWriter(client.getOutputStream());
//MutilUserbutcanparallel
while(true){
Stringstr=in.readLine();
System.out.println(str);
out.println(hasreceive....);
out.flush();
if(str.equals(end))
break;
}
client.close();
}catch(IOExceptionex){
}finally{
}
}
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketserver=newServerSocket(5678);
while(true){
//transferlocationchangeSingleUserorMultiUser
MultiUsermu=newMultiUser(server.accept());
mu.start();
}
}
}
我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系,这样每个线程就有了。一个通讯管道.同样我们可以填写run方法,把之前的操作交给线程来完成,这样多客户并行的Socket就建立起来了。
以上的代码使用的是
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
PrintWriterout=newPrintWriter(client.getOutputStream());
还有一种方法是使用
DataInputStreamisFromClient=newDataInputStream(client.getInputStream());
DataOutputStreamosToClient=newDataOutputStream(client.getOutputStream());
关于这两种输入输出流的不同,我也只知道前一种对字符串支持比较好,后面对于读取一个字符串需要处理,但是可以支持很多种类型的输出。对于传递字符串而言前一种应该是很好的选择了
评论