zoukankan      html  css  js  c++  java
  • So easy Webservice 1.Socket建设web服务

    socket 是用来进行网络通讯的,简单来说,远程机器和本地机器各建一个socket,然后通过该socket进行连接通讯

    socket简单模型图:

    socket的原理图:

    代码实现:

    1.创建socket服务端:用于处理客户端发送的请求数据

    新建socket_server项目,添加SocketServer.java,然后run main方法,服务端处于等待客户端状态。

    public class SocketServer {
        /**
         * 服务器端口
         */
        private static int port = 9999;
        public static void main(String[] args) {
            try {
                //1.创建ServerSocket对象,用于让客户端连接
                ServerSocket serverSocket = new ServerSocket(port);
                //2.线程等待,直到收到客户端请求,进行处理
                while(true){
                    System.out.println("等待客户端请求---");
                    Socket socket = serverSocket.accept();//收到客户端请求
                    //3.获取输入流对象InputStream,用于获取客户端发送的数据
                    InputStream in = socket.getInputStream();
                    byte[] b = new byte[1024];
                    in.read(b);
                    String req = new String(b, 0, b.length);//从0-length
                    System.out.println("获取客户端数据success,reqData = "+req);
                    //4.获取输出流对象OutputStream,用于给客户端返回数据
                    OutputStream out = socket.getOutputStream();
                    //转大写后,返回给客户端
                    out.write(req.toUpperCase().getBytes());
                    
                    //5.结束通信,关闭socket,关闭流
                    in.close();
                    out.close();
                    socket.close();
                }
            } catch (UnknownHostException e) {
                System.out.println("---找不到服务器的端口---");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("---通信错误---");
                e.printStackTrace();
            }
        }
    }

    2.创建客户端

    新建一个socket_client项目,添加SocketClient.java

    public class SocketClient {
        /**
         * 服务器ip地址
         */
        private static String host = "127.0.0.1";
        /**
         * 服务器端口
         */
        private static int port = 9999;
    
        public static void main(String[] args) {
            try {
                //1.创建socket对象,用于向服务端发送请求
                Socket socket = new Socket(host, port);
                //2.获取输出流对象OutputStream,用于给服务端输出数据
                OutputStream out = socket.getOutputStream();
                //输入字符串
                System.out.println("请输入字符串:");
                Scanner input = new Scanner(System.in);
                String reqStr = input.next();
                //输出到服务器
                out.write(reqStr.getBytes());
                //3.获取输入流对象InputStream,用于输入服务端返回处理后的数据
                InputStream in = socket.getInputStream();
                //获取服务端返回的数据
                byte[] b = new byte[1024];
                in.read(b);//将字节输入到b中
                String respStr = new String(b, 0, b.length);
                System.out.println("服务端处理后的结果:"+respStr);
                
                //4.关闭socket,关闭流,结束通信
                in.close();
                out.close();
                socket.close();
                
            } catch (UnknownHostException e) {
                System.out.println("---找不到服务器的端口---");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("---通信错误---");
                e.printStackTrace();
            }
        }
    }

    3.启动客户端:

    客户端 控制台:
    
    请输入字符串:hello(输入后回车)
    
    服务端处理后的结果:HELLo
    
    
    --------------------------------------------
    服务端 控制台:
    
    等待客户端请求---
    
    获取客户端数据success,reqData = hello

    测试:

    1.通过C#客户端来访问JavaSocket服务

     

    2.通过IE来访问SocketService

    accept success.......
    从客户端传送来的数据如下:
    POST / HTTP/1.1
    Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Accept-Language: zh-CN
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    Host: 127.0.0.1:9999

     Content-Length: 10

    Connection: Keep-Alive

    Cache-Control: no-cache

    word=hello

     

    测试结果:

    1.1: 不同的语言支持Socket通信吗? 支持(经测试,上面的socketserver端程序,使用c#,web浏览器也可以访问)

    1.2: 不同的协议支持Socket通信吗? web程序可以调用socket请求,但是由于协议不同,因此在处理的时候要过滤http的协议格式,返回的时候还需要添加 http返回的格式

    1.3: 如果参数多: 可维护性就比较低

    1.4: Socket服务有利于推广吗? 不利

    总结:

    * 服务端流程:
    * 1.创建ServerSocket对象,用于让客户端连接
    * 2.获取socket对象,线程等待,直到收到客户端请求
    * 3.获取输入流对象InputStream,用于获取客户端发送的数据
    * 4.获取输出流对象OutputStream,用于给客户端返回数据
    * 5.结束通信,关闭socket,关闭流
    *
    * socket和webservice比较,缺点:
    * 1.Socket服务不利于推广(如果让别人知道你的Socket服务)
    * 2.Socket处于传输层, 有可能无法穿越防火墙
    * 3.Socket本身处于传输层,要处理应用层的服务要解析HTTP协议比较麻烦,但是现在我们的应用都是基于web的, web中的数据传输就需要HTTP协议
    * 4.即使定义了格式. 后面如果格式改变则客户端格式都需要同步变化维护困难

    /**
    * 客户端流程:
    * 1.创建socket对象,用于向服务端发送请求
    * 2.获取输出流对象OutputStream,用于给服务端输出数据
    * 3.获取输入流对象InputStream,用于接受服务端返回处理后的数据
    * 4.结束通信,关闭socket,关闭流
    * @author mlxs
    *
    */

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    阿里DatatX mysql8往 Elasticsearch 7 插入时间数据 时区引发的问题
    通俗易懂 k8s (3):kubernetes 服务的注册与发现
    ReplicaSet 和 ReplicationController 的区别
    使用Go module导入本地包
    k8s之statefulset控制器
    终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
    Atitit drmmr outline org stat vb u33.docx Atitit drmmr outline org stat v0 taf.docx Atitit drmmr out
    Atitit all diary index va u33 #alldiary.docx Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary deta
    Atitit path query 路径查询语言 数据检索语言 目录 1.1. List map >> spel 1 1.2. Html数据 》》Css选择符 1 1.3. Json 》map》
    Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5163293.html
Copyright © 2011-2022 走看看