【Java 网络编程】TCP 服务器端 客户端 简单示例
文章目录
- I IntelliJ IDEA 创建 Java 项目
- II 客户端 Socket 创建
- III Socket 客户端连接服务器端
- IV Socket 两个端点信息获取
- V 控制台人机交互
- VI Socket 客户端与服务器端交互
- VII ServerSocket 服务器端端口监听
- VIII ServerSocket 服务器端参数获取
- IX ServerSocket 服务器端同时与多个客户端交互方案
- X Socket 客户端代码示例
- XI Socket 服务器端代码示例
- XII 运行客户端与服务器端代码
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. 将输入流转为 BufferedReaderBufferedReader 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();
IX ServerSocket 服务器端同时与多个客户端交互方案
将与单个客户端交互的操作封装到线程中 , 每当与一个新的客户端建立连接 , 就开启一个异步线程处理与该客户端之间的交互 ;
客户端处理线程 :
/*** 异步线程 , 处理单个客户端连接* 如果多个客户端连接 , 就需要创建多个该类, 同时处理多个客户端连接*/public static class ClientHandler extends Thread{//1. 客户端 Socket 连接private Socket clientSocket;public ClientHandler(Socket clientSocket) {this.clientSocket = clientSocket;}}
无限循环等待客户端连接 , 一旦连接成功 , 就开启一个异步线程 ;
//II. 等待客户端连接, 注意此处是无限循环连接while(true){//1. 收到一个客户端连接请求 , 获取 客户端 Socket 连接Socket clientSocket = serverSocket.accept();//2. 将 Socket 连接传入 ClientHandler 线程 , 异步处理与客户端交互操作ClientHandler clientHandler = new ClientHandler(clientSocket);//3. 启动 与客户端 Socket 交互处理 异步线程clientHandler.start();}
X Socket 客户端代码示例
import java.io.*;
import java.net.*;/*** 客户端*/
public class Client {/*** 客户端入口函数* @param args*/public static void main(String[] args){try {//I. 连接//1. 创建 Socket 对象Socket socket = new Socket();//2. 设置 Socket 的超时时间socket.setSoTimeout(5000);//3. 创建连接的端点 , 该端点包括 IP 地址和端口号InetSocketAddress inetSocketAddress =new InetSocketAddress(Inet4Address.getLocalHost(), //本机IP地址8000 //端口号);//4.. 连接服务器端点 , 并设置超时时间socket.connect(inetSocketAddress, 5000);//5. 如果连接成功会继续执行下面的操作, 如果失败会根据失败情况抛出异常//II. 获取 Socket 连接两个端点的属性, IP 地址和端口号//1. 获取服务器 IP 地址InetAddress serverAddress = socket.getInetAddress();//2. 获取服务器端口号int serverPort = socket.getPort();//3. 获取客户端 IP 地址InetAddress clientAddress = socket.getLocalAddress();//4. 获取客户端端口号int clientPort = socket.getLocalPort();System.out.println("服务器连接成功\n服务器地址 : " + serverAddress +" , 服务器端口号 : " + serverAddress +"\n客户端地址 : " + clientAddress + " , 客户端端口号 : " + clientPort);//向服务器端发送数据sendToServer(socket);//III. 关闭 Socket 连接socket.close();System.out.println("客户端 Socket 连接关闭");} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//客户端可能挂了 , 需要重启}}public static void sendToServer(Socket socket){try {//I. 获取用户控制台输入信息//1. 获取控制台输入流InputStream is = System.in;//2. 该输入流会阻塞 , 等待用户控制台输入BufferedReader br = new BufferedReader(new InputStreamReader(is));//II. 将用户输入信息上传到服务器//4. 获取客户端的输出流 , 用于向服务器端写出数据OutputStream os = socket.getOutputStream();//5. 创建打印流 , 用于向服务器端写出字符PrintStream ps = new PrintStream(os);//III. 从服务器获取信息 , 这里循环读取数据, 接收到 服务器端的 quit 字符串才退出//1. 获取服务器端输入流InputStream isFromServer = socket.getInputStream();//2. 将输入流转为 BufferedReaderBufferedReader brFromServer = new BufferedReader(new InputStreamReader(isFromServer));//3. 循环控制变量 , 退出时设置为 falseboolean isReadFromServer = true;while (isReadFromServer){//4. 阻塞命令行 , 等待用户输入一行数据, 并存入 string 对象中String string = br.readLine();//5. 通过打印流 , 将该字符串传输给服务器端ps.println(string);//6. 阻塞控制台 , 从服务器读取一行数据String stringFromServer = brFromServer.readLine();//7. 根据服务器返回的数据进行不同操作if("quit".equals(stringFromServer)){//停止循环isReadFromServer = false;}else{System.out.println(stringFromServer);}}//IV. 释放资源br.close();ps.close();brFromServer.close();} catch (IOException e) {e.printStackTrace();}}
}
XI Socket 服务器端代码示例
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;/*** 服务器端*/
public class Server {/*** 服务器端入口函数* @param args*/public static void main(String[] args){try {//I. 创建服务器套接字, 并监听端口//1. 创建服务器套接字 , 只需要指定端口即可 , 不需要指定 IP 地址// 其 IP 地址就是本机的 IP 地址 , 如果机器有多个 IP 地址// 如果没有指定 IP 地址 , 那么会监听所有的 IP 地址的指定端口号ServerSocket serverSocket = new ServerSocket(8000);//2. 获取服务器端 IP 地址InetAddress inetAddress = serverSocket.getInetAddress();//3. 获取服务器端口号int localPort = serverSocket.getLocalPort();System.out.println("服务器开启\nIP 地址 : " + inetAddress + " , 端口号 : " + localPort);//II. 等待客户端连接, 注意此处是无限循环连接while(true){//1. 收到一个客户端连接请求 , 获取 客户端 Socket 连接Socket clientSocket = serverSocket.accept();//2. 将 Socket 连接传入 ClientHandler 线程 , 异步处理与客户端交互操作ClientHandler clientHandler = new ClientHandler(clientSocket);//3. 启动 与客户端 Socket 交互处理 异步线程clientHandler.start();}} catch (IOException e) {e.printStackTrace();}}/*** 异步线程 , 处理单个客户端连接* 如果多个客户端连接 , 就需要创建多个该类, 同时处理多个客户端连接*/public static class ClientHandler extends Thread{//1. 客户端 Socket 连接private Socket clientSocket;//2. 循环控制变量private boolean loopFlag = true;public ClientHandler(Socket clientSocket) {this.clientSocket = clientSocket;}@Overridepublic void run() {super.run();//I. 获取客户端相关信息//1. 获取客户端的 IP 地址InetAddress inetAddress = clientSocket.getInetAddress();//2. 获取客户端的端口号int port = clientSocket.getPort();//3. 打印客户端的信息System.out.println("客户端信息 : \nIP 地址 : " + inetAddress + " , 端口号 : " + port);try {//II. 创建与客户端交互的输入输出流//1. 获取客户端 Socket 输出流 , 用于向客户端发送数据OutputStream os = clientSocket.getOutputStream();//2. 创建打印流 , 用于向客户端输出数据PrintStream ps = new PrintStream(os);//3. 获取客户端 Socket 输入流 , 用于接收客户端数据InputStream is = clientSocket.getInputStream();//4. 获取客户端的字符输入流 , 该输入流可以阻塞等待客户端输入BufferedReader br = new BufferedReader(new InputStreamReader(is));//III. 循环处理与客户端交互的信息while (loopFlag){//1. 等待客户端输入String string = br.readLine();//2. 处理客户端输入if("quit".equals(string)){//如果客户端发送退出, 那么停止循环, 将该信息在送回客户端loopFlag = false;//将信息发送到客户端ps.println("quit");}else{//将信息打印到控制台System.out.println(string);//将发送成功信息返回给客户端ps.println("发送成功 , 大小 " + string.length() + " 字节");}}//IV. 关闭相关资源ps.close();br.close();} catch (IOException e) {e.printStackTrace();}finally {try {//如果出现异常 , 将该 Socket 关闭clientSocket.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("客户端退出 : \nIP 地址 : " + inetAddress + " , 端口号 : " + port);}}}
XII 运行客户端与服务器端代码
1. 编译两个 Java 代码 : 选择菜单栏 -> Build -> Rebuild Project 选项 , 获取到 Client.class 和 Server.class 文件 ;
2. 字节码文件地址 : 编译后的 class 字节码文件在工程目录的 out\production\classes 目录下 ;
打开两个命令行界面 , 首先进入该目录 , 先运行服务器端 , 在命令行中输入 java Server , 即开启了服务器端 ; 再打开客户端 , 在另一个命令行中运行 java Client , 即开启了客户端 ;
客户端输入文字 , 与服务器端交互 :
【Java 网络编程】TCP 服务器端 客户端 简单示例相关推荐
- java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端
//郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...
- Java网络编程 ---- TCP 网络通信编程
视频:[零基础 快速学Java]韩顺平 零基础30天学会Java 文章目录 1. Socket 2. TCP 网络通信编程 3. 应用案例 1(使用字节流) 4. 应用案例 2(使用字节流) 5. 应 ...
- java网络编程--TCP程序设计
一,本章目标 了解Socket和ServerSocker类的作用 掌握ECHO程序开发 将多线程应用在TCP程序上实现多用户操作 二,具体内容 在java网络程序中,客户端只要符合连接的通讯协议,那么 ...
- 【Java——网络编程基础之客户端服务器连接】
网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...
- Java网络编程---TCP通信
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信 Java对基于TCP协议的 ...
- java网络编程TCP传输—流操作—拿到源后的写入动作
在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 1 //获取sock ...
- Java网络编程 - TCP通信
文章目录 TCP通信 快速入门(一发一收) 编写客户端代码 编写服务器代码 多发多收 多发多收(同时接受多个客户端) 线程池优化 TCP通信 快速入门(一发一收) TCP协议回顾: TCP是一种面向连 ...
- java网络编程基础(知识+代码示例)
目录 网络的相关概念 常用类 InetAddress类 Socket类 TCP字符流编程简单样例 TCP字节流编程简单样例 UDP字节流编程简单样例 小知识点 网络的相关概念 网络:两台或多台设备通过 ...
- java网络编程Socket实现客户端向服务端发送信息
(可按目录按需阅读,我一般会整理的比较细) 前置知识 java IO Socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口. ...
最新文章
- 数据分析之Pandas缺失数据处理
- weiphp----------图灵机器人存在的bug。
- 《VMware Virtual SAN权威指南》一第1章 VSAN概述
- 西安单招学校学计算机软件的,西北大学软件职业技术学院单招
- TeXstudio中文编码踩坑实录
- Activity中finish()和onDestroy()的区别
- Tabio – 轻松,高效的管理 Chrome 标签页
- Python股票分析系列——基础股票数据操作(一)
- selenium实现失败重运行
- 计算机键盘字母记忆,键盘26个字母口诀是怎样的?
- iOS15.4 Beta4 新测试版推送,新增反跟踪功能
- 30岁后的测试工程师都去哪儿了?
- lisp语言cond和if套用_方案 – if和cond之间的区别?
- 图像修复-基本问题和经典方法
- 专题:2019世界移动通信大会(MWC)精彩纷呈,中国企业各出大招
- AVR单片机开发2——流水灯及仿真
- 大数据之离线数仓项目搭建(一)
- 打造自己的JavaScript武器库
- 软件测试面试常见问题(2)
- [转]Jarvis OJ- [XMAN]level2/3_x64-Writeup