zoukankan      html  css  js  c++  java
  • Java网络通信基础编程

    一、同步阻塞方式(BIO)

    方式一:

    服务器端(Server):

     1 package com.ietree.basicskill.socket.mode1;
     2 
     3 import java.io.IOException;
     4 import java.net.ServerSocket;
     5 import java.net.Socket;
     6 
     7 /**
     8  * 服务端
     9  */
    10 public class Server {
    11     // 端口号
    12     final static int PORT = 8765;
    13     public static void main(String[] args) {
    14         ServerSocket server = null;
    15          try {
    16             server = new ServerSocket(PORT);
    17             System.out.println("Server start......");
    18             // 进行阻塞
    19             Socket socket = server.accept();
    20             // 创建一个程序执行客户端的任务
    21             new Thread(new ServerHandler(socket)).start();
    22             
    23         } catch (IOException e) {
    24             e.printStackTrace();
    25         } finally {
    26             if(server != null){
    27                 try {
    28                     server.close();
    29                 } catch (IOException e) {
    30                     e.printStackTrace();
    31                 }
    32             }
    33             server = null;
    34         }
    35     }
    36 }

    采用多线程来处理接收到的请求(ServerHandler):

     1 package com.ietree.basicskill.socket.mode1;
     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 ServerHandler implements Runnable {
    10     private Socket socket;
    11     public ServerHandler(Socket socket) {
    12         this.socket = socket;
    13     }
    14 
    15     @Override
    16     public void run() {
    17         BufferedReader in = null;
    18         PrintWriter out = null;
    19         try {
    20             in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
    21             out = new PrintWriter(this.socket.getOutputStream(), true);
    22             String body = null;
    23             while (true) {
    24                 body = in.readLine();
    25                 if(body == null){
    26                     break;
    27                 }
    28                 System.out.println("Server: " + body);
    29                 out.println("服务器端回送响应的数据。");
    30             }
    31         } catch (Exception e) {
    32             e.printStackTrace();
    33         } finally {
    34             if(in != null){
    35                 try {
    36                     in.close();
    37                 } catch (IOException e) {
    38                     e.printStackTrace();
    39                 }
    40             }
    41             if(out != null){
    42                 try {
    43                     out.close();
    44                 } catch (Exception e) {
    45                     e.printStackTrace();
    46                 }
    47             }
    48             if(socket != null){
    49                 try {
    50                     socket.close();
    51                 } catch (IOException e) {
    52                     e.printStackTrace();
    53                 }
    54             }
    55             socket = null;
    56         }
    57     }
    58 }

    客户端(Client):

     1 package com.ietree.basicskill.socket.mode1;
     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 /**
    10  * 客户端
    11  */
    12 public class Client {
    13     final static String ADDRESS = "127.0.0.1";
    14     final static int PORT = 8765;
    15     public static void main(String[] args) {
    16         Socket socket = null;
    17         BufferedReader in = null;
    18         PrintWriter out = null;
    19         try {
    20             socket = new Socket(ADDRESS, PORT);
    21             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    22             out = new PrintWriter(socket.getOutputStream(), true);
    23             
    24             // 向服务器端发送数据
    25             out.println("接收到客户端的请求数据......");
    26             String response = in.readLine();
    27             System.out.println("Client: " + response);
    28         } catch (Exception e) {
    29             e.printStackTrace();
    30         } finally {
    31             if(in != null){
    32                 try {
    33                     in.close();
    34                 } catch (IOException e) {
    35                     e.printStackTrace();
    36                 }
    37             }
    38             if(out != null){
    39                 try {
    40                     out.close();
    41                 } catch (Exception e) {
    42                     e.printStackTrace();
    43                 }
    44             }
    45             if(socket != null){
    46                 try {
    47                     socket.close();
    48                 } catch (IOException e) {
    49                     e.printStackTrace();
    50                 }
    51             }
    52             socket = null;
    53         }
    54     }
    55 }

    程序输出:

    Server:

    Server start......
    Server: 接收到客户端的请求数据......

    Client:

    Client: 服务器端回送响应的数据。

    方式二:

    Server类:

    package com.ietree.basicskill.socket.basic.bio2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * Created by Administrator on 2017/5/25.
     */
    public class Server {
        final static int PORT = 8765;
    
        public static void main(String[] args) {
            ServerSocket server = null;
            BufferedReader in = null;
            PrintWriter out = null;
            try {
                server = new ServerSocket(PORT);
                System.out.println("Server Start......");
                Socket socket = null;
                HandlerExecutorPool executorPool = new HandlerExecutorPool(50, 1000);
                while (true) {
                    socket = server.accept();
                    executorPool.execute(new ServerHandler(socket));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
                if (server != null) {
                    try {
                        server.close();
                    } catch (Exception e3) {
                        e3.printStackTrace();
                    }
                }
                server = null;
            }
        }
    }
    serverHandler类:
    package com.ietree.basicskill.socket.basic.bio2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    /**
     * Created by Administrator on 2017/5/25.
     */
    public class ServerHandler implements Runnable {
        private Socket socket;
    
        public ServerHandler(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            BufferedReader in = null;
            PrintWriter out = null;
            try {
                try {
                    in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
                    out = new PrintWriter(this.socket.getOutputStream(), true);
                    String body = null;
                    while (true) {
                        body = in.readLine();
                        if (body == null) {
                            System.out.println("Server:" + body);
                            out.println("Server Response");
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (Exception e3) {
                        e3.printStackTrace();
                    }
                }
                socket = null;
            }
        }
    }

    线程池HandlerExecutorPool类:

    package com.ietree.basicskill.socket.basic.bio2;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /**
     * Created by Administrator on 2017/5/25.
     */
    public class HandlerExecutorPool {
    
        private ExecutorService executor;
    
        public HandlerExecutorPool(int maxPoolSize, int queueSize) {
            this.executor = new ThreadPoolExecutor(
                    Runtime.getRuntime().availableProcessors(),
                    maxPoolSize,
                    120L,
                    TimeUnit.SECONDS,
                    new ArrayBlockingQueue<Runnable>(queueSize)
            );
        }
    
        public void execute(Runnable task) {
            executor.execute(task);
        }
    }

    客户端Client类:

    package com.ietree.basicskill.socket.basic.bio2;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    /**
     * Created by Administrator on 2017/5/25.
     */
    public class Client {
    
        final static String ADDRESS = "127.0.0.1";
        final static int PORT = 8765;
    
        public static void main(String[] args) {
            Socket socket = null;
            BufferedReader in = null;
            PrintWriter out = null;
            try {
                socket = new Socket(ADDRESS, PORT);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream(), true);
                out.println("Client request");
                String response = in.readLine();
                System.out.println("Client:" + response);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (Exception e3) {
                        e3.printStackTrace();
                    }
                }
                socket = null;
            }
        }
    }

    程序输出:

    Server端:

    Server Start......
    Server:Client request

    Client端:

    Client:Server Response

    二、 同步非阻塞(NIO)

    三、异步非阻塞(AIO)

  • 相关阅读:
    Java 内部类种类及使用解析
    linux下的一些命令分析与shell的一些命令
    Centos7 安装gitlab
    centos7安装laravel
    laravel中对加载进行优化
    laravel如何利用数据库的形式发送通知
    laravel中的gate
    laravel中的scope作用域
    Laravel 使用firstOrCreate 报错MassAssignmentException
    laravel中关联模型并使用scout导入数据 +视图合成器
  • 原文地址:https://www.cnblogs.com/Dylansuns/p/6883978.html
Copyright © 2011-2022 走看看