通过上面第一章的程序可以看出来,针对服务端只能连接一个客户端,如果有另外一台机器连接主机就会出现错误,连接不上,主要是因为第一章的代码是单线程的,也就是是单对单的服务,服务端server接收到一个client请求后,后面的client请求就无法连接上主机了
下面是多线程的网络通信服务端代码:
package com.sun.net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ManyThreadSocketServer {
private int port = 10000;
private ServerSocket server;
public ManyThreadSocketServer() throws IOException{
server = new ServerSocket( port);
}
public void talk() throws IOException{
while( true){
Socket socket = server.accept();
invoke(socket);
}
}
public void invoke(final Socket socket){
new Thread( new Runnable() {
@Override
public void run() {
try {
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while( true){
msg = br.readLine();
System. err.println(msg);
pw.println( "server:" + msg);
pw.flush();
if(msg.equals( "bye")){
break;
}
}
// socket.close();
// if( br != null){
// br.close();
// }
// if( pw != null){
// pw.close();
// }
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public BufferedReader getReader(Socket socket) throws Exception{
return new BufferedReader( new InputStreamReader(socket.getInputStream()));
}
public PrintWriter getWriter(Socket socket) throws Exception{
return new PrintWriter(socket.getOutputStream());
}
public static void main(String[] args) throws Exception {
new ManyThreadSocketServer().talk();
}
}
客户端代:通过获取系统输入向服务端发送数据信息
package com.sun.net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ManyThreadSocketClient
{
private String serverIp;
private int port;
private Socket socket ;
public ManyThreadSocketClient()
{
serverIp = "192.168.1.103";
port =
10000;
}
public BufferedReader
getReader( Socket socket) throws Exception{
return new BufferedReader( new InputStreamReader(System.in));
}
public PrintWriter
getWriter( Socket socket) throws Exception{
return new PrintWriter(socket.getOutputStream());
}
public void speak(){
try {
socket = new Socket(serverIp,port);
BufferedReader br = getReader( socket);
PrintWriter pw = getWriter( socket);
String msg = null;
while( true){
msg = br.readLine();
pw.println(msg);
pw.flush();
if(msg.equals( "bye")){
break;
}
}
socket.close();
if(br
!= null){
br.close();
}
if(pw
!= null){
pw.close();
}
} catch (Exception
e) {
e.printStackTrace();
}
}
public static void main(String[]
args) {
new ManyThreadSocketClient().speak();
}
}
本文介绍了一种基于Java实现的多线程网络通信方案,服务端能够同时处理多个客户端的连接请求,每个客户端连接都会被分配到独立的线程进行处理。

被折叠的 条评论
为什么被折叠?



