I IntelliJ IDEA 创建 Java 项目
Java 程序使用 IntelliJ IDEA 进行开发 ;
创建客户端项目 :
① 菜单栏 File -> New Project , 弹出 New Project 对话框 , 选择 Gradle 类型下的 java 项目 ;
② 输入 GroupId 和 项目名称 , 一直点击下一步到结束 , 最后一个对话框注意选择项目所在位置 ;
II 客户端 Socket 创建
创建 Socket 需要设置超时时长 , 要连接的服务器端的端点信息 , 该端点包括 IP 地址和端口号 ;
//1. 创建 Socket 对象 Socket socket = new Socket(); //2. 设置 Socket 的超时时间 socket.setSoTimeout(5000); //3. 创建连接的端点 , 该端点包括 IP 地址和端口号 InetSocketAddress inetSocketAddress = new InetSocketAddress( Inet4Address.getLocalHost(), //本机IP地址 8000 //端口号 );
III Socket 客户端连接服务器端
调用 Socket 对象的 connect 方法 , 即可发起对服务器的连接 , 如果连接成功 , 则会继续执行 , 如果连接失败或者超时 , 会抛出异常 ;
//4.. 连接服务器端点 , 并设置超时时间 socket.connect(inetSocketAddress, 5000);
IV Socket 两个端点信息获取
1. 获取服务器端点的 IP 地址和端口号 : 调用 Socket 对象的 getInetAddress 方法获取服务器端 IP 地址 , 调用 getPort 方法获取服务器端的端口号 ;
//1. 获取服务器 IP 地址 InetAddress serverAddress = socket.getInetAddress(); //2. 获取服务器端口号 int serverPort = socket.getPort();
2. 获取客户端端点的 IP 地址和端口号 : 调用 Socket 对象的 getLocalAddress 方法 , 可以获取客户端的 IP 地址 , 调用 getLocalPort 方法可以获取客户端的端口号 ;
//3. 获取客户端 IP 地址 InetAddress clientAddress = socket.getLocalAddress(); //4. 获取客户端端口号 int clientPort = socket.getLocalPort()
;
V 控制台人机交互
客户端信息获取 ( 人机交互 ) : 控制台中等待用户输入 , BufferedReader 的 readLine 方法 , 可以在控制台中阻塞等待用户输入 , 用户可以在控制台输入信息 , 然后客户端将该信息传给服务器 ; 下面是键盘输入流的创建和使用过程
//1. 获取控制台输入流 InputStream is = System.in; //2. 该输入流会阻塞 , 等待用户控制台输入 BufferedReader br = new BufferedReader(new InputStreamReader(is)); //4. 阻塞命令行 , 等待用户输入一行数据, 并存入 string 对象中 String string = br.readLine();
VI Socket 客户端与服务器端交互
服务器 -> 客户端 : 客户端阻塞等待服务器端发送数据 , 从 Socket 中获取 BufferedReader 输入流 , 根据输入流创建 BufferedReader , 调用 readLine 方法阻塞等待服务器传回信息 ;
//1. 获取服务器端输入流 cisFromServer = socket.getInputStream(); //2. 将输入流转为 BufferedReader BufferedReader brFromServer = new BufferedReader(new InputStreamReader(isFromServer)); //6. 阻塞控制台 , 从服务器读取一行数据 String stringFromServer = brFromServer.readLine()
;
客户端 -> 服务器 : 从 Socket 中获取输出流 OutputStream , 根据该输出流创建 PrintStream , 可以将字符串输出到客户端 ;
//4. 获取客户端的输出流 , 用于向服务器端写出数据 OutputStream os = socket.getOutputStream(); //5. 创建打印流 , 用于向服务器端写出字符 PrintStream ps = new PrintStream(os); //5. 通过打印流 , 将该字符串传输给服务器端 ps.println(string);
VII ServerSocket 服务器端端口监听
创建 ServerSocket 对象 , 只需要指定端口即可 , 不需要指定 IP 地址 , 其 IP 地址就是本机的 IP 地址 , 如果机器有多个 IP 地址 , 如果没有指定 IP 地址 , 那么会监听所有的 IP 地址的指定端口号 ;
//1. 创建服务器套接字 , 只需要指定端口即可 , 不需要指定 IP 地址 // 其 IP 地址就是本机的 IP 地址 , 如果机器有多个 IP 地址 // 如果没有指定 IP 地址 , 那么会监听所有的 IP 地址的指定端口号 ServerSocket serverSocket = new ServerSocket(8000);
VIII ServerSocket 服务器端参数获取
调用 ServerSocket 对象的 getInetAddress 获取服务器端的 IP 地址 , 调用该对象的 getLocalPort 可以获取服务器端监听的端口号 ;
//2. 获取服务器端 IP 地址 InetAddress inetAddress = serverSocket.getInetAddress(); //3. 获取服务器端口号 int localPort = serverSocket.getLocalPort();