基于Socket实现多客户/服务器通信程序
客户端:
1 package test; 2 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 public class MultiTalkServer{ 6 static int clientnum=0; //静态成员变量,记录当前客户的个数 7 public static void main(String args[]) throws IOException { 8 ServerSocket serverSocket=null; 9 boolean listening=true; 10 try{ 11 //创建一个ServerSocket在端口4700监听客户请求 12 serverSocket=new ServerSocket(4700); 13 }catch(IOException e) { 14 System.out.println("Could not listen on port:4700."); 15 //出错,打印出错信息 16 System.exit(-1); //退出 17 } 18 while(listening){ //循环监听 19 //监听到客户请求,根据得到的Socket对象和客户计数创建服务线程,并启动之 20 new ServerThread(serverSocket.accept(),clientnum).start(); 21 clientnum++; //增加客户计数 22 } 23 serverSocket.close(); //关闭ServerSocket 24 } 25 }
客户端线程
1 package test; 2 3 import java.io.*; 4 import java.net.*; 5 public class ServerThread extends Thread{ 6 Socket socket=null; //保存与本线程相关的Socket对象 7 int clientnum; //保存本进程的客户计数 8 public ServerThread(Socket socket,int num) { //构造函数 9 this.socket=socket; //初始化socket变量 10 clientnum=num+1; //初始化clientnum变量 11 } 12 public void run() { //线程主体 13 try{ 14 String line; 15 //由Socket对象得到输入流,并构造相应的BufferedReader对象 16 BufferedReader is=new BufferedReader(new 17 InputStreamReader(socket.getInputStream())); 18 //由Socket对象得到输出流,并构造PrintWriter对象 19 PrintWriter os=new PrintWriter(socket.getOutputStream()); 20 //由系统标准输入设备构造BufferedReader对象 21 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); 22 //在标准输出上打印从客户端读入的字符串 23 System.out.println("Client:"+ clientnum +is.readLine()); 24 //从标准输入读入一字符串 25 line=sin.readLine(); 26 while(!line.equals("bye")){//如果该字符串为 "bye",则停止循环 27 os.println(line);//向客户端输出该字符串 28 os.flush();//刷新输出流,使Client马上收到该字符串 29 //在系统标准输出上打印该字符串 30 System.out.println("Server:"+line); 31 //从Client读入一字符串,并打印到标准输出上 32 System.out.println("Client:"+ clientnum +is.readLine()); 33 line=sin.readLine();//从系统标准输入读入一字符串 34 }//继续循环 35 os.close(); //关闭Socket输出流 36 is.close(); //关闭Socket输入流 37 socket.close(); //关闭Socket 38 }catch(Exception e){ 39 System.out.println("Error:"+e);//出错,打印出错信息 40 } 41 } 42 }
服务器端
1 package test; 2 3 import java.io.*; 4 import java.net.*; 5 public class TalkClient { 6 public static void main(String args[]) { 7 try{ 8 //向本机的4700端口发出客户请求 9 Socket socket=new Socket("127.0.0.1",4700); 10 //由系统标准输入设备构造BufferedReader对象 11 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); 12 //由Socket对象得到输出流,并构造PrintWriter对象 13 PrintWriter os=new PrintWriter(socket.getOutputStream()); 14 //由Socket对象得到输入流,并构造相应的BufferedReader对象 15 BufferedReader is=new BufferedReader(new 16 InputStreamReader(socket.getInputStream())); 17 String readline; 18 readline=sin.readLine(); //从系统标准输入读入一字符串 19 while(!readline.equals("bye")){//若从标准输入读入的字符串为 "bye"则停止循环 20 //将从系统标准输入读入的字符串输出到Server 21 os.println(readline); 22 os.flush();//刷新输出流,使Server马上收到该字符串 23 //在系统标准输出上打印读入的字符串 24 System.out.println("Client:"+readline); 25 //从Server读入一字符串,并打印到标准输出上 26 System.out.println("Server:"+is.readLine()); 27 readline=sin.readLine(); //从系统标准输入读入一字符串 28 } //继续循环 29 os.close(); //关闭Socket输出流 30 is.close(); //关闭Socket输入流 31 socket.close(); //关闭Socket 32 }catch(Exception e) { 33 System.out.println("Error"+e); //出错,则打印出错信息 34 } 35 } 36 }