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
    *
    */

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    KVM克隆CentOS6虚拟机后无法启动
    Python socket网络模块
    LNMP的安装--详细版
    CentOS7 二进制安装MySQL5.6.42
    超越线程池:Java并发并没有你想的那么糟糕
    有哪些实用的计算机相关技能,可以在一天内学会?
    如何写出让hr一看就约你面试的简历
    五个最佳编程字体
    Eclipse 的 Debug 介绍与技巧
    Redis时延问题分析及应对
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5163293.html
Copyright © 2011-2022 走看看