Java的Socket编程

server/2024/11/26 21:36:08/

Java的Socket编程是一种基于TCP/IP协议的通信方式,可以用于在客户端和服务器之间建立网络连接,实现数据传输。以下是Socket编程的简单示例,分别展示了服务器端和客户端的实现。

一、服务端代码

服务端使用ServerSocket来监听客户端的连接请求,并用Socket对象来进行数据传输。

java">import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) {try (ServerSocket serverSocket = new ServerSocket(8080)) {System.out.println("Server is listening on port 8080");while (true) {Socket clientSocket = serverSocket.accept();// 获取客户端的IP地址和端口号String clientAddress = clientSocket.getInetAddress().getHostAddress();int clientPort = clientSocket.getPort();System.out.println("New client connected: " + clientAddress + ":" + clientPort);// 启动一个新线程处理该客户端的通信new Thread(new ClientHandler(clientSocket, clientAddress, clientPort)).start();}} catch (Exception e) {e.printStackTrace();}}
}class ClientHandler implements Runnable {private final Socket clientSocket;private final String clientAddress;private final int clientPort;public ClientHandler(Socket socket, String address, int port) {this.clientSocket = socket;this.clientAddress = address;this.clientPort = port;}@Overridepublic void run() {try (BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter output = new PrintWriter(clientSocket.getOutputStream(), true);) {String message;while (true) {// 接收客户端消息message = input.readLine();if ("exit".equalsIgnoreCase(message)) {System.out.println("Client " + clientAddress + ":" + clientPort + " disconnected");break;}System.out.println("Message from " + clientAddress + ":" + clientPort + ": " + message);// 从控制台读取服务端回复System.out.print("Reply to " + clientAddress + ":" + clientPort + ": ");message = new BufferedReader(new InputStreamReader(System.in)).readLine();output.println(message);if ("exit".equalsIgnoreCase(message)) {System.out.println("Server closed the connection with " + clientAddress + ":" + clientPort);break;}}} catch (Exception e) {e.printStackTrace();} finally {try {clientSocket.close();} catch (Exception e) {e.printStackTrace();}}}
}

二、客户端代码

客户端使用Socket连接到服务器,并通过输入输出流与服务器进行通信。

java">import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class Client {public static void main(String[] args) {try (Socket socket = new Socket("localhost", 8080);BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter output = new PrintWriter(socket.getOutputStream(), true);BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in))) {System.out.println("Connected to the server");String message;while (true) {// 从控制台读取客户端输入System.out.print("Client: ");message = consoleInput.readLine();output.println(message);  // 发送消息到服务器if ("exit".equalsIgnoreCase(message)) {System.out.println("Client closed the connection");break;}// 接收服务器的回复message = input.readLine();if ("exit".equalsIgnoreCase(message)) {System.out.println("Server closed the connection");break;}System.out.println("Server: " + message);}} catch (Exception e) {e.printStackTrace();}}
}

三、运行步骤

  1. 启动服务器:首先运行Server类,服务器会开始监听端口8080。
  2. 启动客户端:运行Client类,客户端会连接到服务器并发送消息。
  3. 查看结果:在服务器端和客户端控制台可以看到相互发送和接收的消息。
  • 服务器端

    • 使用ServerSocket监听指定端口(例如8080)。
    • 当客户端连接时,接受连接请求并建立一个Socket
    • 使用输入输出流BufferedReaderPrintWriter与客户端通信。
    • 每当有客户端连接时,启动一个新线程ClientHandler来处理该客户端的通信。
    • ClientHandler中,使用循环接收客户端消息并回消息到客户端,输入"exit"时断开连接并退出循环。
  • 客户端

    • 使用Socket连接到服务器(IP地址为localhost,端口8080)。
    • 创建输入输出流,与服务器进行消息收发。

五、注意事项

  1. 端口冲突:确保端口8080未被其他应用占用。
  2. 关闭连接:可以使用try-with-resources自动关闭Socket和流。
  3. 多线程:为支持多个客户端,可以使用多线程来处理每个客户端请求。

http://www.ppmy.cn/server/137786.html

相关文章

Ubuntu:docker 安装和使用

本文将介绍在 Ubuntu 上安装和使用 docker 的方法和 bash 命令。 一、安装 sudo apt update sudo apt install docker.io二、启动 sudo systemctl start docker sudo systemctl enable docker三、下载 sudo docker pull registry.cn-hangzhou.aliyuncs.com/......四、运行 …

分布式和微服务系统区别

一、分布式是更广泛的概念,指将计算分布在多个物理节点上的系统。 适用于需要高可用性、高性能、可扩展性的系统。 应用场景:分布式数据库—数据高可用存储、分布式缓存—提升数据访问速度 分布式计算框架—大规模数据计算、分布式文件系统—海量数据的…

Hbuilder html5+沉浸式状态栏

manifest.json源码视图添加 {"statusbar": {"immersed": true }如图: 2、plusready准备,将状态栏字体变黑,不然背景白色、状态栏白色看不到 //2.1 如果你用了mui, mui.plusReady(function(){plus.navigat…

css 禁止用户选中元素

一、使用user-select属性 1. user-select: none; 可以直接应用于特定的元素&#xff0c;阻止用户选中该元素的文本内容。 .disabled-element {user-select: none;} 然后在 HTML 中&#xff0c;将这个类应用到需要禁止选中的元素上 <p class"disabled-element"…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言&#xff0c;涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等&#xff0c;能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能&#xff0c;并且免费开源&#xff0c;能够完美地…

.net core中间件Polly

Polly 是一个 .NET 库,用于处理应用程序的弹性和容错,尤其是在与外部服务交互时。 它提供了各种策略(如重试、断路器、超时、降级等),帮助我们处理请求失败的情况,以提高应用程序的可靠性。 一、使用 Polly 的基本步骤: 1、安装 Polly: 通过 NuGet 包管理器安装 Pol…

机器人领域中的scaling law:通过复现斯坦福机器人UMI——探讨数据规模化定律(含UMI的复现关键)

前言 在24年10.26/10.27两天&#xff0c;我司七月在线举办的七月大模型机器人线下营时&#xff0c;我们带着大家一步步复现UMI「关于什么是UMI&#xff0c;详见此文&#xff1a;UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)」&…

可编辑97页PPT | 制造企业数字化转型战略咨询及IT总体规划方案

荐言分享&#xff1a;制造企业数字化转型是当前市场环境下的必然趋势&#xff0c;旨在通过引入先进的信息技术&#xff0c;优化业务流程&#xff0c;提升运营效率&#xff0c;增强客户体验&#xff0c;实现可持续发展。这一转型过程涉及多个方面&#xff0c;需要综合考虑企业战…