zoukankan      html  css  js  c++  java
  • 【BigData】Java基础_socket编程

    socket主要用于进行计算机之间进行通信,分为服务端与客户端。服务端启动后,处于监听端口等待状态,当客户端向服务端指定端口发送数据后,服务端收到数据后才会关闭连接。

    以下是一个socket编程有浅到深逐渐递增难度的案例

    一、最简单的scoket案例(单次发送与接收)

    1.逐个接受字符

    服务端:ServerDemo.java

    package cn.test.logan.day13.one;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            // 启动一个socket服务端(本质是向操作系统注册一个端口)
            ServerSocket ss = new ServerSocket(2050);
            System.out.println("端口为2050的服务端已经启动.....");
            // 监听端口消息
            Socket sc = ss.accept(); //等待并接受客户端请求,建立socket连接,此处是一个阻塞方法
            
            // 从连接中接受数据,首先需要获得一个输入流工具
            InputStream in = sc.getInputStream();
            
            // 从输入流中获取数据
            
            // 逐个字符打印
            int line = 0;
            while((line = in.read())!=-1) {
                System.out.println((char)line);
            }
                
            // 关闭流
            in.close();
            // 关闭socket
            sc.close();
            
        }
    }

    客户端:ClientDemo.java

    package cn.test.logan.day13.one;
    
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientDemo {
        public static void main(String[] args) throws  Exception {
            // 向服务端发出建立连接的请求
            Socket sc = new Socket("localhost",2050);
            //从连接拿到一个发数据的工具
            OutputStream out = sc.getOutputStream();
            // 利用out流发送数据
            out.write("hello".getBytes());
            // 关闭流
            out.close();
            // 关闭连接
            sc.close();
        }
    
    }

     先运行服务端,当服务端处于监听状态后再运行客户端,输出结果如下:

     2.一次性接收多个字节数据

     

     只需要将1中的逐个字符打印这段代码修改为上图,则能实现一次性接收多个字节数据。运行后结果如下:

     二、实现多次交互

     服务端代码:ServiceDemo.java

    package cn.test.logan.day13.three;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServiceDemo {
        public static void main(String[] args) throws Exception {
            // 启动一个socket服务端(本质是向操作系统注册一个端口)
            ServerSocket ss = new ServerSocket(9999);
            // 建立连接
            Socket sc = ss.accept();
            
            // 获取输入(输出)流工具,用于实现交互
            InputStream in = sc.getInputStream();
            OutputStream out = sc.getOutputStream();
            
            // 新建一个数组用于存储接收到信息
            byte[] b = new byte[1024];
            int num = 0;
            
            // 接收第1个问题
            num = in.read(b);
            System.out.println("第1次的问题是:"+new String(b,0,num));
            
            // 发送第1个答案
            out.write("我是logan".getBytes());
            
            // 接收第2个问题
            num = in.read(b);
            System.out.println("第2次的问题是:"+new String(b,0,num));
            // 发送第2个答案
            out.write("我22岁".getBytes());
            in.close();
           out.close();
            sc.close();
    } }

     客户端代码:ClientDem.java

    package cn.test.logan.day13.three;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientDemo {
        public static void main(String[] args) throws Exception {
            // 向服务端发出建立连接的请求
            Socket sc = new Socket("localhost",9999);
            //从连接拿到一个发数据的工具
            OutputStream out = sc.getOutputStream();
            
            // 发送第1个问题
            out.write("你是谁?".getBytes());
            
            // 接收第1个问题的答案
            InputStream in = sc.getInputStream();
            byte[] b = new byte[1024];
            int num = in.read(b);
            System.out.println("接收到第1个答案是:" + new String(b,0,num) );
            
            // 发送第2个问题
            out.write("你几岁了?".getBytes());
            // 接收第2个问题的答案
            num = in.read(b);
            System.out.println("接收到第2个答案是:" + new String(b,0,num) );
        in.close();
           out.close();
            sc.close(); } }

    执行后输出结果:

    客户端打印结果如下:

    服务端打印结果如下:

     但是上述代码存在一个问题,两次交互完毕后,无论是客户端还是服务端程序都停止了,如果有其他客户端需要连接服务端,那就无法连接,为了避免这个问题,可以在服务端进行特殊控制

    服务端改造后代码如下:

    package cn.test.logan.day13.three;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServiceDemo {
        public static void main(String[] args) throws Exception {
            // 启动一个socket服务端(本质是向操作系统注册一个端口)
            ServerSocket ss = new ServerSocket(9999);
            
            int i = 1;
            while(true) {
                // 建立连接
                Socket sc = ss.accept();
                System.out.println("*******第"+i+"个客户端连接***********");
                // 获取输入(输出)流工具,用于实现交互
                InputStream in = sc.getInputStream();
                OutputStream out = sc.getOutputStream();
                
                // 新建一个数组用于存储接收到信息
                byte[] b = new byte[1024];
                int num = 0;
                
                // 接收第1个问题
                num = in.read(b);
                System.out.println("第1次的问题是:"+new String(b,0,num));
                
                // 发送第1个答案
                out.write("我是logan".getBytes());
                
                // 接收第2个问题
                num = in.read(b);
                System.out.println("第2次的问题是:"+new String(b,0,num));
                // 发送第2个答案
                out.write("我22岁".getBytes());
                in.close();
                out.close();
                sc.close();
                
                i++; // 为了记录客户端连接数
            }
            
        }
    }

    执行结果如下:(发起三次客户端后得到的结果)

  • 相关阅读:
    剑指 Offer 42. 连续子数组的最大和
    剑指 Offer 41. 数据流中的中位数
    剑指 Offer 40. 最小的k个数
    剑指 Offer 39. 数组中出现次数超过一半的数字
    20210510日报
    20210507日报
    20210506日报
    20210505日报
    20210504日报
    20210503日报
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12148707.html
Copyright © 2011-2022 走看看