Socket连接代码示例、WebService 小demo示例

来源:互联网 发布:淘宝司法拍卖平台进入 编辑:程序博客网 时间:2024/06/12 02:09

最近面试遇到的问题

  • 1:开闭原则
    开放对原来代码的扩展,封闭对原来代码的修改

  • 2:http协议
    A : URL是http(超文本传输协议)是基于请求与响应模式的、无状态的、应用层协议。长基于TCP的连接方式
    B : HTTP请求,http请求分别包括(请求行、消息报头、请求正文)
    请求行:Method Request-URI HTTP-Version CRLF
    Method请求方式包括(GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS)
    C : HTTP响应,http响应分别包括(状态行、消息报头、返回正文)
    状态行:HTTP-Version Status-Code Reason-Phrase CRLF
    详细见:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

  • 3:https协议

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
    详细见:http://blog.csdn.net/yufaw/article/details/8515889

    什么是HTTPS
    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安 全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使 用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。

    HTTP和HTTPS的区别
    http协议和https有着很大的区别。总的来说,http效率更高,https安全性更高。
    https协议需要到ca申请证书,一般免费证书很少,需要交费。 http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议 http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
    http的连接很简单,是无状态的 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全


  • 4:Socket连接代码示例
    Socket编程概念有两个:1、ServerSocket(服务端);2、Socket(客户端)。服务端与客户端之间通过Socket来建立连接,并通信

1):服务端代码:

package cn.com.demo5;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server5 {    public static void main(String args[]) throws IOException {        // 为了简单起见,所有的异常信息都往外抛        int port = 8899;        // 定义一个ServerSocket监听在端口8899上        ServerSocket server = new ServerSocket(port);        while (true) {            //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的            //服务器启动后,或完成一个连接后,会再次在此等候下一个连接            Socket socket = server.accept();            // 每接收到一个Socket就建立一个新的线程来处理它            new Thread(new Server5Task(socket)).start();        }    }}

2):创建ServerTask类:

package cn.com.demo5;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Writer;import java.net.Socket;/** * 用来处理Socket请求的 */public class Server5Task implements Runnable {    private Socket socket;    //构造函数    public Server5Task(Socket socket) {        this.socket = socket;    }    //实现Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。    public void run() {        try {            //调用与客户端实现的方法            handleSocket();        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 跟客户端Socket进行通信     *      * @throws Exception     */    private void handleSocket() {        BufferedReader br = null;        Writer writer = null;        try {            //接收客户端传递过来的参数,设置接收的编码格式为:GBK            br = new BufferedReader(new InputStreamReader(                    socket.getInputStream(), "GBK"));            StringBuilder sb = new StringBuilder();            String temp;            int index;            while ((temp = br.readLine()) != null) {                System.out.println(temp);                // 遇到 eof 时就结束接收                if ((index = temp.indexOf("eof")) != -1) {                    sb.append(temp.substring(0, index));                    break;                }                sb.append(temp);            }            System.out.println("客户端: " + sb);            // 服务端下发给客户端的参数,设置传递参数的编码格式为:UTF-8            writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");              writer.write("你好,客户端。");            /**             * BufferedReader的readLine方法是一次读一行的,这个方法是阻塞的,             * 直到它读到了一行数据为止程序才会继续往下执行,那么readLine什么时候才会读到一行呢?             * 直到程序遇到了换行符或者是对应流的结束符readLine方法才会认为读到了一行,才会结束其阻塞,让程序继续往下执行。             * 所以我们在使用BufferedReader的readLine读取数据的时候一定要记得在对应的输出流里面一定要写入换行符             * (流结束之后会自动标记为结束,readLine可以识别),写入换行符之后一定记得如果输出流不是马上关闭的情况下记得flush一下,             * 这样数据才会真正的从缓冲区里面写入             */            writer.write("eof\n");            //是当前线程休眠,单位为毫秒值。可测试客户端代码里面的超时设置            Thread.sleep(12 * 100);            writer.flush();//写完后要记得flush          } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (writer != null) {                    writer.close();                }                if (br != null) {                    br.close();                }                if (socket != null) {                    socket.close();                }            } catch (Exception e2) {                e2.printStackTrace();            }        }    }}

3):客户端代码:

package cn.com.demo5;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.Writer;import java.net.Socket;import java.net.SocketTimeoutException;public class Client5 {    public static void main(String args[]) {        Socket client = null;        Writer writer = null;        BufferedReader br = null;        String host = "127.0.0.1"; // 要连接的服务端IP地址        int port = 8899; // 要连接的服务端对应的监听端口        try {            // 与服务端建立连接            client = new Socket(host, port);            // 建立连接后就可以往服务端写数据了            // 客户端发送给服务端的参数,设置传递参数的编码格式为:GBK            writer = new OutputStreamWriter(client.getOutputStream(), "GBK");            writer.write("你好服务端。");            writer.write("eof\n");//BufferedReader读取,记得加换行            writer.flush();            // 写完以后进行读操作            br = new BufferedReader(new InputStreamReader(                    client.getInputStream(), "UTF-8"));            // 设置超时间为10秒            client.setSoTimeout(10 * 1000);            StringBuffer sb = new StringBuffer();            String temp;            int index;            try {                while ((temp = br.readLine()) != null) {                    if ((index = temp.indexOf("eof")) != -1) {                        sb.append(temp.substring(0, index));                        break;                    }                    sb.append(temp);                }            } catch (SocketTimeoutException e) {                System.out.println("数据读取超时。");            }            System.out.println("服务端: " + sb);        } catch (Exception e) {            e.printStackTrace();        } finally{            try {                if (writer != null) {                    writer.close();                }                if (writer != null) {                    br.close();                }                if (writer != null) {                    client.close();                }            } catch (Exception e2) {                e2.printStackTrace();            }        }    }}

详细了解:http://haohaoxuexi.iteye.com/blog/1979837

  • 4:WebService入门:

    1)、WebService工作原理-SOAP
    当客户端调用一个WebService的方法时,首先将方法名称和需要传递的参数包装成XML,也就是SOAP包,通过HTTP协议传递到服务器端,然后服务器端解析这段XML,得到被调用的方法名称和传递过来的参数,进而调用WebService相应的方法,方法执行完毕后,将返回结果再次包装为XML,也就是SOAP响应,发送到客户端,最后客户端解析这段XML,最终得到返回结果。

    2)、WebService 小demo示例:
    A:创建WebService项目,如图:
    这里写图片描述

    B:代码示例:

package cn.com.service;import javax.jws.WebMethod;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.xml.ws.Endpoint;/** * 申明 WebService 类 * @author Summer * */@WebService()@SOAPBinding(style = SOAPBinding.Style.RPC)public class Hello {    @WebMethod(operationName="test1")    public String sayHello(String userName) {         return "Hello,"+userName+"!";     }     @WebMethod(operationName="test2")    public String sayHello() {         return "Hello World!";     }     //执行该方法报错时,在在前面加上 @SOAPBinding(style = SOAPBinding.Style.RPC)    public static void main(String[] args) {        //将WebService发布到指定地址          Endpoint.publish("http://localhost:8080/WebServiceTest/Hello", new Hello());        System.out.println("Success");        //浏览器输入地址:http://localhost:8080/WebServiceTest/Hello?wsdl    }}

C : 在浏览器中输入上述地址后,如图:
这里写图片描述

下载文件:http://dldx.csdn.net/fd.php?i=993243919716741&s=d86ec19649b90aef8ca3ab3bce8f5b69

下载完文件后,解压;进入cmd 输入:
1.打开 cmd
2.敲dos 命令: d: 回车
3.敲dos 命令: cd D:\WebServers\axis-1_4\lib 回车(具体包存放的位置)
4.敲dos 命令: java -classpath “.;commons-logging- 1.0.4.jar;axis.jar;commons-discovery-0.2.jar;jaxrpc.jar;wsdl4j-1.5.1.jar;saaj.jar;activation.jar;mail.jar” org.apache.axis.wsdl.WSDL2Java -o “abcdefg”
5.接着第4步:加上空格,再加上你的地址;如: http://localhost:8080/WebServiceTest/Hello?wsdl
6:生成的java文件会存放在:D:\WebServers\axis-1_4\lib\abcdefg 目录下。将文件拷入你的工程里面。并将里面的jar包也拷到项目lib目录下
7:创建 clientTset 类进行测试

package cn.com.client;import java.rmi.RemoteException;import javax.xml.rpc.ServiceException;import cn.com.service.Hello;import cn.com.service.HelloServiceLocator;public class clientTest {    public static void main(String args[]) throws ServiceException, RemoteException {            HelloServiceLocator service = new HelloServiceLocator();            Hello helloProxy = service.getHelloPort();            String hello1 = helloProxy.test1("世界");         System.out.println(hello1);         String hello2 = helloProxy.test2();         System.out.println(hello2);      } }

8:运行结果:Hello,世界 Hello World!(不知为何,我这边响应很慢,等了好几分钟才出现结果。)



浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入

0 0
原创粉丝点击