• socket + 多线程学习


    摘要:

      实现一个伪分布式打印远程通信程序。

    Master:实现接收客户端消息,并分发给底层slaver打印消息。

      1 package com.cn.ludy.master;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.IOException;
      5 import java.io.InputStreamReader;
      6 import java.io.PrintWriter;
      7 import java.net.ServerSocket;
      8 import java.net.Socket;
      9 import java.util.ArrayList;
     10 
     11 //master负责两项工作,1,注册;2,分发任务。
     12 //1,注册包括接收slaver的注册,将slaver的服务端口保存到list表中
     13 //2,分发任务包括接收client发来的数据,交给list表中任意一个salver执行
     14 public class Master {
     15     // master接收client数据的端口
     16     private int clientPort = 10000;
     17     // master接收salver注册的端口
     18     private int slaverPort = 10001;
     19     // salver的注册list
     20     private static ArrayList<Integer> slaverMap;
     21 
     22     public Master() {
     23         slaverMap = new ArrayList<Integer>();
     24     }
     25 
     26     public void start() {
     27         // 启动侦听slaver线程
     28         Thread tSlaver = new listenSlaver();
     29         tSlaver.start();
     30 
     31         // 启动侦听client线程
     32         Thread tClient = new listenClient();
     33         tClient.start();
     34     }
     35 
     36     // 侦听client
     37     class listenClient extends Thread {
     38         private ServerSocket server2Client;
     39         private Socket client;
     40         private BufferedReader in;
     41 
     42         public listenClient() {
     43             try {
     44                 server2Client = new ServerSocket(clientPort);
     45             } catch (IOException e) {
     46                 // TODO Auto-generated catch block
     47                 e.printStackTrace();
     48             }
     49         }
     50 
     51         @Override
     52         public void run() {
     53             System.out.println("启动了一个监听client的线程");
     54             while (true) {
     55                 try {
     56                     client = server2Client.accept();
     57                     System.out.println("监听到一个client");
     58                     in = new BufferedReader(new InputStreamReader(client.getInputStream()));
     59 
     60                     // 获取client需要打印值
     61                     String line = in.readLine();
     62                     while (line != null) {
     63                         System.out.println("Master:from client:" + client.getInetAddress() + ",客户端输入:" + line);
     64 
     65                         // 找到空闲slaver,命令其打印
     66                         int slaverPort = slaverMap.get((int) (Math.random() * slaverMap.size()));
     67 
     68                         System.out.println("任务交给" + slaverPort);
     69                         System.out.println("任务:" + line);
     70                         Socket scoket2Slaver = new Socket("127.0.0.1", slaverPort);
     71 
     72                         PrintWriter out2Slaver = new PrintWriter(scoket2Slaver.getOutputStream(), true);
     73                         ;
     74 
     75                         out2Slaver.println("任务:" + line);
     76                         out2Slaver.flush();
     77                         scoket2Slaver.close();
     78 
     79                         line = in.readLine();
     80 
     81                         System.out.println("一次任务执行完毕,等待……");
     82                     }
     83                     client.close();
     84                 } catch (IOException e) {
     85                     System.out.println("error:Master:start");
     86                 }
     87             }
     88         }
     89     }
     90 
     91     // 侦听slaver
     92     class listenSlaver extends Thread {
     93         private ServerSocket server2Slaver;
     94         private Socket slaver;
     95         private BufferedReader in;
     96 
     97         public listenSlaver() {
     98             try {
     99                 server2Slaver = new ServerSocket(slaverPort);
    100             } catch (IOException e) {
    101                 // TODO Auto-generated catch block
    102                 e.printStackTrace();
    103             }
    104         }
    105 
    106         @Override
    107         public void run() {
    108             System.out.println("启动了一个监听slaver的线程");
    109             try {
    110                 while (true) {
    111                     slaver = server2Slaver.accept();
    112                     System.out.println("有一个slaver注册成功,slaver port:" + slaver.getPort());
    113 
    114                     in = new BufferedReader(new InputStreamReader(slaver.getInputStream()));
    115 
    116                     String line = in.readLine();
    117 
    118                     while (line != null) {
    119                         // 获取slaver的port值,注册
    120                         slaverMap.add(Integer.parseInt(line.substring(12)));
    121                         System.out.println("Master:from slaver:" + slaver.getInetAddress() + ":" + slaver.getPort()
    122                                 + ",其服务端口:" + line.substring(12));
    123                         line = in.readLine();
    124                     }
    125                     slaver.close();
    126                 }
    127             } catch (IOException e) {
    128                 System.out.println("error:Master:listenSlaver");
    129             }
    130         }
    131     }
    132 
    133     public static void main(String[] args) {
    134         new Master().start();
    135     }
    136 }
    View Code

    MasterSlaver:实现打印消息。

     1 package com.cn.ludyhu.masterserver;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 import java.io.PrintWriter;
     7 import java.net.ServerSocket;
     8 import java.net.Socket;
     9 import java.net.UnknownHostException;
    10 
    11 public class MasterSlaver 
    12 {
    13     //master的IP 与 监听port
    14     private String masterAddr = "127.0.0.1";
    15     private int masterRegitePort = 10001;
    16     
    17     //slaver接受任务的服务端口
    18     private ServerSocket server; 
    19     private int serverPort = 8081;
    20     private Socket client; 
    21     private BufferedReader in; 
    22     private PrintWriter out; 
    23     
    24     public MasterSlaver()
    25     {
    26         
    27     }
    28     //连接master,注册
    29     public void register()
    30     {
    31         try {
    32             //连接master,并向其发送自己的服务端口号
    33             Socket registSocket = new Socket(masterAddr,masterRegitePort);
    34             String reportMsg = "i am slaver:"+serverPort;
    35 
    36             //与master的注册连接发送流,发送自己的服务端口号
    37             out = new PrintWriter(registSocket.getOutputStream(),true);             
    38             out.println(reportMsg);
    39             out.flush();
    40             registSocket.close();
    41             
    42             System.out.println("我是slaver "+serverPort+"已经向master"+masterAddr+":"+masterRegitePort+"注册");            
    43         } catch (UnknownHostException e) {
    44             // TODO Auto-generated catch block
    45             e.printStackTrace();
    46         } catch (IOException e) {
    47             // TODO Auto-generated catch block
    48             e.printStackTrace();
    49         }
    50     }
    51     
    52     //启动监听服务端口,接收master调用,完成打印任务
    53     public void start()
    54     {
    55         try 
    56         { 
    57             server = new ServerSocket(serverPort); 
    58             while (true) 
    59             { 
    60                 client = server.accept(); 
    61                 //接受master调用,开始执行打印任务
    62                 System.out.println("开始执行打印任务:");
    63                 
    64                 in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
    65                 out = new PrintWriter(client.getOutputStream(),true); 
    66         
    67                 String line = in.readLine();                 
    68                 while (line != null) 
    69                 {     
    70                     System.out.println("getTask : from master:"+line);
    71                     line = in.readLine(); 
    72                 } 
    73                 System.out.println("任务执行完毕,服务端口为:"+serverPort);
    74                 out.println("任务执行完毕,服务端口为:"+serverPort+"---下次任务再见!---"); 
    75                 out.close();
    76                 client.close(); 
    77             } 
    78         } 
    79         catch (IOException e) 
    80         {
    81             System.out.println("error:masterSlaver "+serverPort+" in method start");
    82         } 
    83     }
    84     
    85     
    86     public static void main(String[] args)
    87     {
    88         MasterSlaver slaver = new MasterSlaver();
    89         slaver.register();
    90         slaver.start();
    91     }
    92 
    93 }
    View Code

    Client:向Master发送消息。

     1 package com.cn.ludy.client;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 import java.io.PrintWriter;
     7 import java.net.Socket;
     8 
     9 public class Client {
    10     Socket client;
    11     BufferedReader in;
    12     PrintWriter out;
    13 
    14     public Client() {
    15     }
    16 
    17     public void start() {
    18         String localhost = "127.0.0.1";
    19         try {
    20             // 连接master
    21             client = new Socket(localhost, 10000);
    22             in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    23             out = new PrintWriter(client.getOutputStream(), true);
    24             BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
    25 
    26             while (true) {
    27                 String str = line.readLine();
    28                 out.println(str);
    29                 out.flush();
    30                 if (str.equals("end")) {
    31                     break;
    32                 }
    33             }
    34         } catch (IOException e) {
    35             System.out.println("error:client:start");
    36         }
    37     }
    38 
    39     public static void main(String[] args) {
    40         new Client().start();
    41     }
    42 
    43 }
    View Code
    计划、执行、每天高效的活着学着
  • 相关阅读:
    js window对象
    bootstrap之输入框组
    安卓开发学习笔记(一):如何用Android Stuidio导出apk文件?
    达观杯文本智能处理挑战赛 练手代码实现
    kali linux学习笔记(四) : 网络端口大全介绍
    kali linux 网络渗透测试学习笔记(三)社会工程学之Java攻击:钓鱼网站制作
    Java提高篇(三):内部类和匿名内部类
    Java提高篇(二):IO字节流、字符流和处理流
    Java提高篇(一):区分引用变量与对象
    kali linux 网络渗透测试学习笔记(二)OWASP ZAP工具扫描SQL injection漏洞失败
  • 原文地址:https://www.cnblogs.com/huxiaoyun90/p/2787399.html
Copyright © 2020-2023  润新知