Java面试题,面试必备宝典大全

文章目录


26、【上机】写出建立TCP客户端Socket的代码。并说明建立Socket后,通过什么方法Socket获得流对象?

27、基于UDP的Socket网络编程的主要步骤是什么?

28、【上机】使用UDP的方式,完成对象的传递。

29、HTTPClient相关问题

30、NIO 和传统 BIO区别是什么?

26、【上机】写出建立TCP客户端Socket的代码。并说明建立Socket后,通过什么方法Socket获得流对象?

Java面试题,面试必备宝典大全

27、基于UDP的Socket网络编程的主要步骤是什么?

基于UDP协议的Socket编程的主要步骤

服务器端(server):

Java面试题,面试必备宝典大全

客户端(client):

Java面试题,面试必备宝典大全

28、【上机】使用UDP的方式,完成对象的传递。

(1)客户端向服务器端传送对象信息;Java面试题,面试必备宝典大全

Java面试题,面试必备宝典大全

(2)服务器端从客户端接收对象信息;

Java面试题,面试必备宝典大全

29、HTTPClient相关问题

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请求?

引入依赖

Java面试题,面试必备宝典大全

简单的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);

30、NIO 和传统 BIO区别是什么?

NIO vs BIO之间的理念上面的区别(NIO将阻塞交给了后台线程执行)

IO是面向流的,NIO是面向缓冲区的

Java BIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;

NIO则能前后移动流中的数据,因为是面向缓冲区的 BIO流是阻塞的,NIO流是不阻塞的 Java IO的各种流是阻塞的。

这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。

该线程在此期间不能再干任何事情了 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。

NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。

非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

选择器

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

相关推荐