zoukankan      html  css  js  c++  java
  • Web Service 实例基于Socket创建Web服务

    ServerSocket服务器端代码如下:

    public static void main(String[] args) throws IOException {
            // 1:建立服务器端的tcp socket服务,必须监听一个端口
            ServerSocket ss = new ServerSocket(9999);
            // 2: 通过服务器端的socket对象的accept方法获取连接上的客户端对象
            Socket s = null;
            // 3:获取客户端的数据
            while (true) {
                // 接受Socket服务,如果有,没有则堵塞,等待
                s = ss.accept();
                System.out.println("accept success.......");
                // 从Socekt输入流中获取客户端发送过来的输出流
                InputStream in = s.getInputStream();
                byte[] buf = new byte[1024];
                int len = in.read(buf);
                String str = new String(buf, 0, len);
                System.out.println("从客户端传送来的数据如下:");
                System.out.println(str);
                // 通过服务器端Socket输出流,写数据,会传送到客户端Socket输入流中
                OutputStream out = s.getOutputStream();
                // 把字母转化为大写
                out.write(str.toUpperCase().getBytes());
                s.close();
            }
        }

    通过Java客户端访问SocketService服务

    public static void main(String[] args) throws Exception {
            Scanner input=new Scanner(System.in);
            // 1: 创建一个基于TCP协议的socket服务,在建立对象时,要指定连接服务器和端口号
            Socket s=new Socket("127.0.0.1",9999);
            // 2: 通过建立的Socket对象获取Socket中的输出流,的调用getOutStream方法
            OutputStream out=s.getOutputStream();
            System.out.println("请输入要转化的字母,或者单词!");
            // 3: 写入到Socket输出流中
            String word=input.next();
            out.write(word.getBytes());
            // 4: 通过建立的Socket对象获取Socket中的输入流,输入流会接受来自服务器端数据
            InputStream in=s.getInputStream();
            byte[] buf=new byte[1024];
            // 5: 获取输入字节流的数据,注意此方法是堵塞的,如果没有获取数据会一直等待
            int len=in.read(buf);
            String str=new String(buf,0,len);
            System.out.println("服务返回来的结果如下:");
            System.out.println(str);
            // 关闭Socket
            s.close();
        }    }

    注意先启动服务器端在启动客户端:否则会出现连接异常

    服务器端显示结果如下:

    accept success.......
    从客户端传送来的数据如下:
    hello

    客户端端显示结果如下:

    请输入要转化的字母,或者单词!
    hello
    服务返回来的结果如下:
    HELLO

    问题思考

    目前我们用Java语言创建一个Socket服务器端, 然用 Java Socket访问没有任何问题. 用C# Socket客户端访问也没有任何问题(说明不同过的语言编写的程序可以通过Socket通信) 用IE访问Socket服务端同样也没问题,IE本身是用VC++语言开发的

    但是, 如果我们的服务复杂一点呢. 例如 我过去的单词 操作1:小写转大写,2:大写转小写 3:英文转中文…… 而且我们发现IE在发送请求的时候不但传输的数据还传输了协议. 而且目前我们的很多应用都是基于Web开发的. 如果我们处理Web的请求. 那么还需要从发送过来的协议中获取数据.所以最好的解决办法就是规定格式, 客户端统一格式发送,只要格式统一,服务器端就从指定的格式中获取数据就OK了

    “Socket+规范格式”创建Web服务

    服务器端代码修改后如下:

    public static void main(String[] args) throws Exception {
            // 1:建立服务器端的tcp socket服务,必须监听一个端口
            ServerSocket serverSocket = new ServerSocket(7777);
            Socket socket = null;
            while (true) {
                // 接受Socket服务,如果有,没有则堵塞,等待
                socket = serverSocket.accept();
                // 从Socekt输入流中获取客户端发送过来的输出流
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int size = inputStream.read(bytes);
                String word=new String(bytes, 0, size);
                System.out.println("字节数为:" + size + "内容为:" + word);
                /*--根据不同的类型选择不同的服务,格式是由服务器端制定   type=int,word=string--*/
                String[] content=word.split(",");
                // 获取服务的类型
                int type=Integer.parseInt(content[0].split("=")[1]);
                // 获取处理服务的数据
                String val=content[1].split("=")[1];
                String result=wordService(val, type);        /*-------------------------------------------------------*/
                OutputStream out = socket.getOutputStream();
                System.out.println("返回的结果如下:" + result);
                out.write(result.getBytes());
                socket.close();
            }
        }
        //  type=1 小写转大写  type=2大写转小写
        public static String wordService(String val,int type){
            return type==1?val.toUpperCase():val.toLowerCase();
        }

    Socket客户端访问SocektFormatService服务端代码如下:

    public static void main(String[] args) throws Exception {
    // 1: 创建一个基于TCP协议的socket服务,在建立对象时,要指定连接服务器和端口号
            Socket s=new Socket("127.0.0.1",9999);
            // 2: 通过建立的Socket对象获取Socket中的输出流,的调用getOutStream方法
            OutputStream out=s.getOutputStream();
    //        out.write("type=2,word=HELLO".getBytes());
            out.write("type=1,word=hello".getBytes());
        // 4: 通过建立的Socket对象获取Socket中的输入流,输入流会接受来自服务器端数据
            InputStream in=s.getInputStream();
            byte[] buf=new byte[1024];
            // 5: 获取输入字节流的数据,注意此方法是堵塞的,如果没有获取数据会一直等待
            int len=in.read(buf);
            String str=new String(buf,0,len);
            System.out.println("服务返回来的结果如下:");
            System.out.println(str);
            // 关闭Socket
            s.close();
        }

    IE调用SocektFormatService服务:

    如果要让IE调用则 Socket服务端首先要从传输过来的HTTP协议中获取传输过来的信息(去除请求行、消息报头)然后在进行服务的处理.因为Socket是基于TCP协议的 而IE是基于HTTP协议的,不同协议格式不一样. 所以处理起来比较麻烦,此处省略

    解决方案一的缺点:

    1. Socket服务不利于推广(如果让别人知道你的Socket服务)
    2. Socket处于传输层, 有可能无法穿越防火墙
    3. Socket本身处于传输层,要处理应用层的服务要解析HTTP协议比较麻烦,但是现在我们的应用都是基于web的, web中的数据传输就需要HTTP协议
    4. 即使定义了格式. 后面如果格式改变则客户端格式都需要同步变化维护困难
  • 相关阅读:
    Spring MVC 核心组件详解
    Spring MVC 入门就这一篇
    Spring 事务解决方案
    【UGUI源码分析】Unity遮罩之Mask详细解读
    游戏开发中不同时区下的时间问题
    ARTS第十三周(阅读Tomcat源码)
    Win10 电脑安装.NET低版本提示“这台计算机中已经安装了 .NET Framwork 4.6.2或版本更高的更新”问题
    Dynamics 365 Setup 提示SqlServer 存在
    Dynamics CRM "Verification of prerequisites for Domain Controller promotion failed. Certificate Server is installed."
    Dynamics CRM
  • 原文地址:https://www.cnblogs.com/loaderman/p/10131506.html
Copyright © 2011-2022 走看看