• Socket编程基础篇


    Socket又称"套接字",应用程序通常通过“套接字”向网络发生请求或者应答网络请求。

      Socket和ServerSocket类库位于java.net包中,ServerSocket用于服务端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例。操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或在客户端而产生级别。不管Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

    首先我们先看一段代码,了解Socket编程连接,然后再做详细的介绍:

    服务端:

    package bhz.bio;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    public class Server {
    
        final static int PROT = 8765;
        
        public static void main(String[] args) {
            
            ServerSocket server = null;
            try {
                server = new ServerSocket(PROT);
                System.out.println(" server start .. ");
                //进行阻塞
                Socket socket = server.accept();
                //新建一个线程执行客户端的任务
                new Thread(new ServerHandler(socket)).start();
                
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(server != null){
                    try {
                        server.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                server = null;
            }
            
            
            
        }
    }
    package bhz.bio;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    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 {
                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) break;
                    System.out.println("Server :" + body);
                    out.println("服务器端回送响的应数据.");
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(in != null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(out != null){
                    try {
                        out.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                socket = null;
            }
            
            
        }
    
    }

    客户端:

    package bhz.bio;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    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("接收到客户端的请求数据...");
                out.println("接收到客户端的请求数据1111...");
                String response = in.readLine();
                System.out.println("Client: " + response);
                
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(in != null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(out != null){
                    try {
                        out.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                socket = null;
            }
        }
    }

    套接字连接的过程可以分为四个步骤,服务器监听,客户端请求服务器,服务器确认,客户端确认,进行通信。

      (1)服务器监听:是服务端套接字并不定位具体的客户端套接字,而是出于等待连接的状态,实时监控网络状态。

      (2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述他要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

      (3)服务器端连接确认:是指当服务器端套接字监听到或者接收到客户端套接字的连接请求,他就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发送给客户端。

      (4)客户端连接确认:一旦客户确认了此描述,连接就建立好了。双方开始通信,二服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

  • 相关阅读:
    力扣(LeetCode)验证回文字符串II 个人题解
    力扣(LeetCode)寻找数组的中心索引 个人题解
    力扣(LeetCode)验证回文串 个人题解
    力扣(LeetCode)三个数的最大乘积 个人题解
    力扣(LeetCode)二进制求和 个人题解
    力扣(LeetCode)加一 个人题解
    力扣(LeetCode)整数反转 个人题解
    力扣(LeetCode)颠倒二进制位 个人题解
    力扣(LeetCode)最后一个单词的长度 个人题解
    力扣(LeetCode)学生出勤记录I 个人题解
  • 原文地址:https://www.cnblogs.com/longqingyang/p/8256833.html
Copyright © 2020-2023  润新知