Java基于Socket的简单多线程服务模式
以一个简单的服务器为例,读取客户端数据并且原封不动返回给客户端,再在客户端进行输出,并且这个服务器是基于多线程的,可以为每个连接进来的客户端进行进行服务。
服务端代码:
public class EchoServer {
static ExecutorService pool = Executors.newCachedThreadPool();
static class HandleMsg implements Runnable {
Socket client;
public HandleMsg(Socket client) {
this.client = client;
}
@Override
public void run() {
BufferedReader bufferedReader = null;
PrintWriter printWriter = null;
try {
bufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
printWriter = new PrintWriter(client.getOutputStream(),true);
String inputline = null;
while((inputline=bufferedReader.readLine())!=null) {
printWriter.println(inputline);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(bufferedReader!=null)bufferedReader.close();
if(printWriter!=null)printWriter.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
ServerSocket echoServer = null;
Socket client = null;
echoServer = new ServerSocket(4490);
System.out.println("EchoServer.main()");
while (true) {
client=echoServer.accept();
System.out.println("connect");
pool.execute(new HandleMsg(client));
}
}
}
客户端代码:
public class EchoClient {
public static void main(String[] args) throws IOException {
Socket client = null;
BufferedReader bufferedReader = null;
PrintWriter printWriter = null;
client = new Socket();
try {
client.connect(new InetSocketAddress("localhost", 7788));
printWriter=new PrintWriter(client.getOutputStream(),true);
printWriter.println("hello");
printWriter.flush();
bufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println(bufferedReader.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (printWriter != null)
printWriter.close();
if (bufferedReader != null)
try {
bufferedReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (client != null)
client.close();
}
}
}