文章目录

  • 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 服务器端 客户端 简单示例相关推荐

  1. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  2. Java网络编程 ---- TCP 网络通信编程

    视频:[零基础 快速学Java]韩顺平 零基础30天学会Java 文章目录 1. Socket 2. TCP 网络通信编程 3. 应用案例 1(使用字节流) 4. 应用案例 2(使用字节流) 5. 应 ...

  3. java网络编程--TCP程序设计

    一,本章目标 了解Socket和ServerSocker类的作用 掌握ECHO程序开发 将多线程应用在TCP程序上实现多用户操作 二,具体内容 在java网络程序中,客户端只要符合连接的通讯协议,那么 ...

  4. 【Java——网络编程基础之客户端服务器连接】

    网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...

  5. Java网络编程---TCP通信

    TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信 Java对基于TCP协议的 ...

  6. java网络编程TCP传输—流操作—拿到源后的写入动作

    在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 1 //获取sock ...

  7. Java网络编程 - TCP通信

    文章目录 TCP通信 快速入门(一发一收) 编写客户端代码 编写服务器代码 多发多收 多发多收(同时接受多个客户端) 线程池优化 TCP通信 快速入门(一发一收) TCP协议回顾: TCP是一种面向连 ...

  8. java网络编程基础(知识+代码示例)

    目录 网络的相关概念 常用类 InetAddress类 Socket类 TCP字符流编程简单样例 TCP字节流编程简单样例 UDP字节流编程简单样例 小知识点 网络的相关概念 网络:两台或多台设备通过 ...

  9. java网络编程Socket实现客户端向服务端发送信息

    (可按目录按需阅读,我一般会整理的比较细) 前置知识 java IO Socket 什么是socket?socket字面意思其实就是一个插口或者套接字,包含了源ip地址.源端口.目的ip地址和源端口. ...

最新文章

  1. 数据分析之Pandas缺失数据处理
  2. weiphp----------图灵机器人存在的bug。
  3. 《VMware Virtual SAN权威指南》一第1章 VSAN概述
  4. 西安单招学校学计算机软件的,西北大学软件职业技术学院单招
  5. TeXstudio中文编码踩坑实录
  6. Activity中finish()和onDestroy()的区别
  7. Tabio – 轻松,高效的管理 Chrome 标签页
  8. Python股票分析系列——基础股票数据操作(一)
  9. selenium实现失败重运行
  10. 计算机键盘字母记忆,键盘26个字母口诀是怎样的?
  11. iOS15.4 Beta4 新测试版推送,新增反跟踪功能
  12. 30岁后的测试工程师都去哪儿了?
  13. lisp语言cond和if套用_方案 – if和cond之间的区别?
  14. 图像修复-基本问题和经典方法
  15. 专题:2019世界移动通信大会(MWC)精彩纷呈,中国企业各出大招
  16. AVR单片机开发2——流水灯及仿真
  17. 大数据之离线数仓项目搭建(一)
  18. 打造自己的JavaScript武器库
  19. 软件测试面试常见问题(2)
  20. [转]Jarvis OJ- [XMAN]level2/3_x64-Writeup

热门文章

  1. 使用CEfSharp之旅(1) 加载网络页面
  2. Python脚本导出为exe程序
  3. Makefile:160: recipe for target 'all' failed (Ubuntu 16.06 + Opencv3.2)解决办法
  4. iOS企业版使用第三方实现自动更新版本
  5. tideways+xhgui搭建php 7的性能测试环境
  6. 乱码问题引申 python 中string和unicode
  7. Sum-product Networks
  8. vue 页面跳转的两种方式
  9. 抽象类和接口-手机小案例
  10. oracle 年龄计算 岁 月 天