最近面试遇到的问题
- 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不支持拖拽文件导入