从零开始学Java Socket编程:客户端与服务器通信实战

简介: 【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!

在编程的世界里,网络通信是不可或缺的一环,而Java Socket编程则是掌握这项技能的基石。本篇教程将以“从零开始”的理念,引导你逐步构建一个简单的客户端-服务器通信系统,无需任何先验知识,只需跟随步骤,即可体验Socket编程的魅力。

开始前的准备

在我们开始之前,确保你的开发环境已安装Java JDK。本教程将在命令行下进行,如果你使用的是IDE(如IntelliJ IDEA或Eclipse),也可以在相应的环境中运行代码。

第一步:创建服务器端

首先,我们来创建一个基本的服务器端。服务器的主要任务是监听特定端口上的连接请求,并能接收客户端发来的消息。

import java.io.*;
import java.net.*;

public class SimpleServer {
   
    public static void main(String[] args) {
   
        int port = 12345; // 监听的端口号
        try (ServerSocket serverSocket = new ServerSocket(port)) {
   
            System.out.println("Server started. Listening on port " + port);

            // 等待客户端连接
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected.");

            // 创建输入流,用于读取客户端发来的消息
            BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream())
            );

            // 创建输出流,用于向客户端发送消息
            PrintWriter out = new PrintWriter(
                new OutputStreamWriter(clientSocket.getOutputStream()), 
                true // 自动刷新缓冲区
            );

            String receivedMessage;
            while ((receivedMessage = in.readLine()) != null) {
   
                System.out.println("Received: " + receivedMessage);
                // 反馈消息给客户端
                out.println("Echo: " + receivedMessage);
            }

            // 关闭连接
            clientSocket.close();
        } catch (IOException e) {
   
            System.err.println("Error occurred: " + e.getMessage());
        }
    }
}

第二步:创建客户端

接下来,我们构建客户端,它将连接到上面创建的服务器,并发送一条消息,然后接收服务器的反馈。

import java.io.*;
import java.net.*;

public class SimpleClient {
   
    public static void main(String[] args) {
   
        String serverAddress = "localhost"; // 服务器地址
        int port = 12345; // 服务器监听的端口

        try (Socket socket = new Socket(serverAddress, port)) {
   
            System.out.println("Connected to server at " + serverAddress + ":" + port);

            // 创建输出流,用于向服务器发送消息
            PrintWriter out = new PrintWriter(
                new OutputStreamWriter(socket.getOutputStream()), 
                true // 自动刷新缓冲区
            );

            // 创建输入流,用于读取服务器发来的消息
            BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream())
            );

            // 向服务器发送消息
            out.println("Hello, Server!");

            // 接收服务器的反馈
            String receivedMessage = in.readLine();
            System.out.println("Received from server: " + receivedMessage);

            // 关闭连接
            socket.close();
        } catch (IOException e) {
   
            System.err.println("Error occurred: " + e.getMessage());
        }
    }
}

运行程序

现在,你可以先在命令行中运行SimpleServer,然后在另一个终端窗口中运行SimpleClient。观察服务器和客户端的控制台输出,你会发现客户端发送的消息被服务器接收,并原样返回给了客户端。

结语

恭喜你完成了第一个Socket编程项目!通过本教程,你不仅学习了如何创建服务器和客户端,还掌握了基本的网络通信原理。这是你迈向网络编程领域的重要一步。随着经验的积累,你将能够构建更复杂的应用,如多人聊天室、文件传输服务等。继续探索,Java Socket编程的世界正等着你去征服。

相关文章
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
14691 33
MCP客户端调用看这一篇就够了(Java版)
|
存储 网络协议 Java
Java获取客户端IP问题:返回127.0.0.1
总结:要解决Java获取客户端IP返回127.0.0.1的问题,首先要找出原因,再采取合适的解决方案。请参考上述方案来改进代码,确保在各种网络环境下都能正确获取客户端IP地址。希望本文对您有所帮助。
870 25
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
780 10
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
265 3
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
1232 4
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
349 1
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
432 4
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
303 3
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
373 2