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

最近面试遇到的问题

  • 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!(不知为何,我这边响应很慢,等了好几分钟才出现结果。)



浏览器兼容

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

  • 相关推荐

    相关文章