Java面试题,面试必备宝典大全
文章目录
26、【上机】写出建立TCP客户端Socket的代码。并说明建立Socket后,通过什么方法Socket获得流对象?
27、基于UDP的Socket网络编程的主要步骤是什么?
28、【上机】使用UDP的方式,完成对象的传递。
29、HTTPClient相关问题
30、NIO 和传统 BIO区别是什么?
26、【上机】写出建立TCP客户端Socket的代码。并说明建立Socket后,通过什么方法Socket获得流对象?
基于UDP协议的Socket编程的主要步骤
服务器端(server):
客户端(client):
(1)客户端向服务器端传送对象信息;
(2)服务器端从客户端接收对象信息;
1. 什么是httpClient?
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
2. 什么是HttpClient不能做的?
l HttpClient不是浏览器,它是一个客户端http协议传输类库。
l HttpClient被用来发送和接受Http消息。
l HttpClient会处理http消息的内容,不会进行javascript解析,不会关心content type,如果没有明确设置,httpclient也不会对请求进行格式化、重定向url,或者其他任何和
l http消息传输相关的功能。
3. HttpClient有哪些特性?
l 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
l 支持自动转向
l 支持 HTTPS 协议
l 支持代理服务器等
4. HttpClient怎样发送带参数的GET请求?
引入依赖
简单的get和post请求
public static void main(String[] args) throws Exception{
try {
//此为百度一篇文章
String url = "https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_15984470154821203735%22%7D&n_type=0&p_from=1";
// 使用默认配置创建httpclient的实例
CloseableHttpClient client = HttpClients.createDefault();
// HttpPost post = new HttpPost(url);
HttpGet get = new HttpGet(url);
// CloseableHttpResponse response = client.execute(post);
CloseableHttpResponse response = client.execute(get);
// 服务器返回码
System.out.println(response.getStatusLine().toString());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
// 服务器返回内容
String respStr = null;
HttpEntity entity = response.getEntity();
if(entity != null) {
respStr = EntityUtils.toString(entity, "UTF-8");
}
System.out.println("respStr = " + respStr);
// 释放资源
EntityUtils.consume(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
5. HttpClient怎样发送带参数的POST请求?
public static void main(String[] args) {
try {
String url = "http://localhost:9090"; // 使用默认配置创建httpclient的实例 CloseableHttpClient client = HttpClients.createDefault(); HttpPost post = new HttpPost(url); /** * 设置参数,常用的有StringEntity,UrlEncodedFormEntity,MultipartEntity * 具体看org.apache.http.entity包 */
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("username", "张三"));
params.add(new BasicNameValuePair("password", "123456"));
UrlEncodedFormEntity e = new UrlEncodedFormEntity(params, "UTF-8");
post.setEntity(e);
CloseableHttpResponse response = client.execute(post); // 服务器返回码
int status_code = response.getStatusLine().getStatusCode(); System.out.println(status_code); // 服务器返回内容
String respStr = null;
HttpEntity entity = response.getEntity();
if(entity != null) {
respStr = EntityUtils.toString(entity, "UTF-8");
}
System.out.println("respStr = " + respStr); // 释放资源
EntityUtils.consume(entity);
} catch (Exception e) {
e.printStackTrace();
}
}
6. HttpClient怎样获取响应状态?
int StatusCode = httpResponse.getStatusLine().getStatusCode();
7. HttpClient怎样获取响应内容?
HttpEntity httpEntity = response.getEntity();
if(httpEntity !=null) {
System.out.println("长度: "+ httpEntity.getContentLength());
System.out.println("内容: "+ EntityUtils.toString(httpEntity,"UTF-8"));
}
8. HttpClient怎样上传文件?
String uploadUrl = "http://localhost:9102/upload.do";
HttpPost httpPost = new HttpPost(uploadUrl);
FileBody fileBody = new FileBody(new File("C:/Users/Administrator/Desktop/timg.jpg")); MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); multipartEntityBuilder.addPart("file",fileBody);
// 设置其他参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new NameValuePair("Accept","application/json, text/plain, */*")); nvps.add(new NameValuePair("Accept-Encoding","gzip, deflate, br"));
nvps.add(new NameValuePair("Accept-Language","zh-CN,zh;q=0.9"));
nvps.add(new NameValuePair("Connection","keep-alive"));
nvps.add(new NameValuePair("Content-Length","28700"));
nvps.add(new NameValuePair("Content-Type","multipart/form-data; boundary=----WebKitFormBoundarypaEfQmIQBbUrkI0c"));
nvps.add(new NameValuePair("Host","localhost:9102"));
nvps.add(new NameValuePair("Origin","http://localhost:9102"));
nvps.add(new NameValuePair("Referer","http://localhost:9102/admin/goods_edit.html")); nvps.add(new NameValuePair("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36")); HttpEntity reqEntity = multipartEntityBuilder.build();
httpPost.setEntity(reqEntity);
CloseableHttpResponse response = httpClient.execute(httpPost);
NIO vs BIO之间的理念上面的区别(NIO将阻塞交给了后台线程执行)
IO是面向流的,NIO是面向缓冲区的
Java BIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;
NIO则能前后移动流中的数据,因为是面向缓冲区的 BIO流是阻塞的,NIO流是不阻塞的 Java IO的各种流是阻塞的。
这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。
该线程在此期间不能再干任何事情了 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。
NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
选择器
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。