Java的socket编程

简介: Java的socket编程

一、引言

在Java中,Socket编程是实现网络通信的一种重要方式。Socket是网络通信的基本单元,它提供了不同计算机之间的进程间通信的能力。通过Socket编程,我们可以创建出各种复杂的网络应用,如聊天室、文件传输、网络游戏等。本文将详细介绍Java Socket编程的基本概念、主要类和方法,并通过示例代码展示如何使用它们。


二、Socket编程的基本概念

1. 客户端与服务器

在Socket编程中,通常有两个角色:客户端(Client)和服务器(Server)。服务器监听某个端口上的连接请求,一旦有客户端请求连接,服务器就接受连接并与客户端建立通信。客户端则主动发起连接请求,与服务器建立连接后进行通信。


2. IP地址和端口号

IP地址用于唯一标识网络中的计算机,而端口号则用于唯一标识计算机中的进程。在Socket编程中,我们需要指定服务器的IP地址和端口号来建立连接。


3. TCP与UDP

TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常用的网络传输协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP则是一种无连接的、不可靠的、基于数据报的传输层通信协议。在Java Socket编程中,我们通常使用TCP协议来建立可靠的连接。


三、Java Socket编程的主要类和方法

1. ServerSocket类

ServerSocket类用于创建服务器端的Socket对象。它有一个accept()方法,用于监听来自客户端的连接请求,并返回一个与客户端通信的Socket对象。

示例代码:

java复制代码

ServerSocket serverSocket = new ServerSocket(8888); // 监听8888端口
Socket clientSocket = serverSocket.accept(); // 等待客户端连接


2. Socket类

Socket类用于创建客户端的Socket对象。它有一个构造函数,用于指定服务器的IP地址和端口号,从而建立与服务器的连接。一旦连接建立,就可以使用getOutputStream()和getInputStream()方法获取输出流和输入流,用于向服务器发送数据和从服务器接收数据。

示例代码:

java复制代码

Socket socket = new Socket("localhost", 8888); // 连接本地主机的8888端口
OutputStream outputStream = socket.getOutputStream(); // 获取输出流
InputStream inputStream = socket.getInputStream(); // 获取输入流


3. 字节流与字符流

在Java中,通常使用字节流(InputStream和OutputStream)或字符流(Reader和Writer)来读写数据。对于Socket编程,我们通常使用字节流来传输数据,因为网络通信是基于字节的。但是,如果需要传输文本数据,也可以使用字符流进行封装。


4. 关闭Socket连接

在通信完成后,需要关闭Socket连接以释放资源。可以使用Socket类的close()方法关闭连接。同时,也需要注意在异常处理中关闭连接,以避免资源泄露。


四、示例代码:简单的Echo服务器与客户端

下面是一个简单的Echo服务器与客户端的示例代码,用于演示Java Socket编程的基本用法。

1. Echo服务器

java复制代码

public class EchoServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server started. Waiting for client...");

Socket clientSocket = serverSocket.accept();
System.out.println("Client connected. IP: " + clientSocket.getInetAddress().getHostAddress());

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

String message;
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
out.write("Echo: " + message);
out.newLine();
out.flush();
}

clientSocket.close();
serverSocket.close();
}
}


2. Echo客户端

java复制代码

public class EchoClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8888);
System.out.println("Connected to server.");

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

Scanner scanner = new Scanner(System.in);
while (true)

 

相关文章
|
6天前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
139 1
|
2月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
257 83
|
1月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
245 3
|
6天前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
230 100
|
23天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
57 16
|
17天前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
108 1
|
1月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
1月前
|
安全 Java Shell
Java模块化编程(JPMS)简介与实践
本文全面解析Java 9模块化系统(JPMS),帮助开发者解决JAR地狱、类路径冲突等常见问题,提升代码的封装性、性能与可维护性。内容涵盖模块化核心概念、module-info语法、模块声明、实战迁移、多模块项目构建、高级特性及最佳实践,同时提供常见问题和面试高频题解析,助你掌握Java模块化编程精髓,打造更健壮的应用。
|
1月前
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
189 0