学完该阶段内容,你将会很好的完成如下的面试题
socket面试试题相关:
1.写一个简单的socket程序,实现客户端发送数据,服务端收到数据后,将该内容转发给客户端
2.简要概述一下socket的请求流程
3.简要概述一下什么是3次握手,为什么需要3次握手
4.简要概述一下什么是4次挥手,为什么需要4次挥手
5.简单说一下你对io流的认识
6.简要说一下TCP/IP的通信模型
7.简要说一下socket的通信模型
8.简要说一下OSI通信模型有那7层,tcp协议在那一层?路由选择那一层
9.简要说一下socket能否传递java对象,怎么传
10.简要说一下如何实现多个客户端同时连接同一个服务端
11.socket如何实现多线程传送文件
12.简要说一下tcp与udp的区别
13.简要说一下你对io \ bio \ nio \ aio 的认识
1.socket简介
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。
socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;
HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
对于java程序来说,它的实现方式是通过调用网络库(java.net库)的一些API函数来实现分布在不同主机的相关进程之间的数据交换
2.socket hello world
需求:写一个简单的服务器程序,客户端向服务端发送数据,服务端收到数据后,返回一句:"你好,我已经收到数据".
2.1.两个重要的API介绍
ServerSocket \ Socket
API地址:http://blog.fondme.cn:8000/apidoc/jdk-1.8-google/
2.2.服务端设计
服务端设计步骤:
1.创建socket服务端
serverSocket = new ServerSocket(1001);
2.监听客户端(是一个阻塞方法)
server = serverSocket.accept();
3.获取输入流
server.getInputStream()
4.获取输出流
server.getOutputStream()
5.关闭资源
serverSocket.close();
案例代码:
package com.wfd360.com.socket; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * @Copyright (C)公众号:java实战分享 * @Author: 姿势帝-博客园 * @Date: 2019-09-01 15:14 * @Description: */ public class ServerSocketDemo { /** * ServerSocket 的构造方法如下所示。 * ServerSocket():无参构造方法。 * ServerSocket(int port):创建绑定到特定端口的服务器套接字。 * ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。 * ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器。 * <p> * =================================================================================================================== * ServerSocket 的常用方法如下所示。 * Server accept():监听并接收到此套接字的连接。 * void bind(SocketAddress endpoint):将 ServerSocket 绑定到指定地址(IP 地址和端口号)。 * void close():关闭此套接字。 * InetAddress getInetAddress():返回此服务器套接字的本地地址。 * int getLocalPort():返回此套接字监听的端口。 * SocketAddress getLocalSoclcetAddress():返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。 * int getReceiveBufferSize():获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是从 ServerSocket 接收的套接字的建议缓冲区大小。 * * @param args 服务端设计步骤: * 1.创建socket服务端 * serverSocket = new ServerSocket(1001); * 2.监听客户端 * server = serverSocket.accept(); * 3.获取输入流 * server.getInputStream() * 4.获取输出流 * server.getOutputStream() * 5.关闭资源 * serverSocket.close(); */ public static void main(String[] args) { ServerSocket serverSocket = null; Socket server = null; BufferedReader reader = null; BufferedWriter writer = null; try { //1.建立socket服务器 serverSocket = new ServerSocket(1001); System.out.println("服务端创建成功----"); while (true) { //2.监听客户端连接 server = serverSocket.accept(); //3.读取客户端数据 reader = new BufferedReader(new InputStreamReader(server.getInputStream())); String s = reader.readLine(); System.out.println("服务端收到数据:" + s); //4.响应客户端 writer = new BufferedWriter(new OutputStreamWriter(server.getOutputStream())); writer.write("已经收到数据[" + s + "]\n"); //清除 writer.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { //关闭资源 if (writer != null) { writer.close(); } if (reader != null) { reader.close(); } if (server != null) { server.close(); } if (serverSocket != null) { serverSocket.close(); } } catch (Exception e) { e.printStackTrace(); } } } }