YuCloud

紫菊气,飘庭户,晚烟笼细雨。

《谢新恩·冉冉秋光留不住》 - 五代 - 李煜

学习问题记录(7)--网络编程

基于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 }

 

posted @ 2020-11-18 20:23  tree[3]  阅读(96)  评论(0编辑  收藏  举报