Java基于Socket实现简单的多线程回显服务器功能示例
本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能。分享给大家供大家参考,具体如下:
需要两个类,一个是EchoServer,代表服务器。另外一个是EchoServerClient,代表客户端。代码如下:
packageinterview;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassEchoServer{
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketserver=newServerSocket(6789);
while(true){
Socketclient=server.accept();
ClientHandlerhandler=newClientHandler(client);
newThread(handler).start();
}
}
publicstaticclassClientHandlerimplementsRunnable{
privateSocketclient;
@Override
publicvoidrun(){
InputStreamReaderisr=null;
try{
isr=newInputStreamReader(client.getInputStream());
BufferedReaderbr=newBufferedReader(isr);
PrintWriterpw=newPrintWriter(client.getOutputStream());
Stringmsg=br.readLine();
System.out.println("收到"+client.getInetAddress()+"发送的"+msg);
pw.println("收到了你发的"+msg);
pw.flush();
}catch(IOExceptione){
e.printStackTrace();
}
}
publicClientHandler(Socketclient){
this.client=client;
}
}
}
下面是客户端代码:
packageinterview;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.Socket;
importjava.net.UnknownHostException;
importjava.util.Scanner;
publicclassEchoServerClient{
publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{
Socketclient=newSocket("127.0.0.1",6789);
Scannersc=newScanner(System.in);
System.out.print("请输入要发送的内容:");
Stringmsg=sc.nextLine();
sc.close();
PrintWriterpw=newPrintWriter(client.getOutputStream());
pw.println(msg);
pw.flush();
InputStreamReaderisr=newInputStreamReader(client.getInputStream());
BufferedReaderbr=newBufferedReader(isr);
System.out.println("服务器返回:"+br.readLine());
client.close();
}
}
NIO多路复用套接字方法如下:
packageinterview;
importjava.io.IOException;
importjava.net.InetSocketAddress;
importjava.nio.ByteBuffer;
importjava.nio.CharBuffer;
importjava.nio.channels.SelectionKey;
importjava.nio.channels.Selector;
importjava.nio.channels.ServerSocketChannel;
importjava.nio.channels.SocketChannel;
importjava.nio.charset.CharacterCodingException;
importjava.nio.charset.Charset;
importjava.nio.charset.CharsetDecoder;
importjava.nio.charset.CharsetEncoder;
importjava.util.Iterator;
publicclassEchoServerNIO{
privatestaticServerSocketChannelserverChannel=null;
privatestaticSelectorselector=null;//多路复用选择器
privatestaticByteBufferbuffer=null;//缓冲区
publicstaticvoidmain(String[]args)throwsIOException{
init();
listen();
}
staticvoidinit()throwsIOException{
serverChannel=ServerSocketChannel.open();
buffer=ByteBuffer.allocate(1024);
serverChannel.socket().bind(newInetSocketAddress(6789));
serverChannel.configureBlocking(false);
selector=Selector.open();
serverChannel.register(selector,SelectionKey.OP_ACCEPT);
}
staticvoidlisten()throwsIOException{
while(true){
if(selector.select(5000)!=0){
Iteratorit=selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKeykey=it.next();
it.remove();
handleKey(key);
}
}
}
}
staticvoidhandleKey(SelectionKeykey)throwsIOException{
SocketChannelchannel=null;
if(key.isAcceptable()){
ServerSocketChannelserverChannel=(ServerSocketChannel)key.channel();
channel=serverChannel.accept();
channel.configureBlocking(false);
channel.register(selector,SelectionKey.OP_READ);
}elseif(key.isReadable()){
channel=(SocketChannel)key.channel();
buffer.clear();
if(channel.read(buffer)>0){
buffer.flip();
CharBuffercharBuffer=CharsetHelper.decode(buffer);
Stringmsg=charBuffer.toString();
System.out.println("收到"+channel.getRemoteAddress()+"的消息:"+msg);
channel.write(CharsetHelper.encode(CharBuffer.wrap("receivedyourmsg:"+msg)));
}
}
}
publicstaticclassCharsetHelper{
privatestaticfinalStringUTF_8="UTF-8";
privatestaticCharsetEncoderencoder=Charset.forName(UTF_8).newEncoder();
privatestaticCharsetDecoderdecoder=Charset.forName(UTF_8).newDecoder();
privateCharsetHelper(){
}
publicstaticByteBufferencode(CharBufferin)throwsCharacterCodingException{
returnencoder.encode(in);
}
publicstaticCharBufferdecode(ByteBufferin)throwsCharacterCodingException{
returndecoder.decode(in);
}
}
}
更多关于java相关内容感兴趣的读者可查看本站专题:《JavaSocket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。