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. 即使定义了格式. 后面如果格式改变则客户端格式都需要同步变化维护困难
  • 相关阅读:
    VS2013编译sqlicipher的.net版本
    oracle 通过obdc sqlserver
    PPT2016输出文件图片的分辨率
    EndNote新参考文献格式下载及使用
    word 利用 ‘邮件合并’提取字段批量生成文案
    matlab 制图——填充两曲线 之间的区域
    Geoda计算莫兰指数
    皮尔逊相关系数计算
    Matlab mat文写入txt
    多元地理加权回归软件使用和含义
  • 原文地址:https://www.cnblogs.com/loaderman/p/10131506.html
Copyright © 2011-2022 走看看