在Java开发中,通过Socket传输XML文件是跨系统数据交互的常见需求,核心流程包括读取XML文件内容、建立Socket连接、封装XML报文并发送三个步骤,下面逐一介绍具体实现方法。

一、XML文件读取
首先需要读取本地XML文件的内容,将其转为字符串格式,方便后续通过Socket传输。可以使用Java的IO流或者NIO相关类实现文件读取,这里使用传统的IO流方式演示。
import java.io.*;
public class XmlFileReader {
public static String readXmlFile(String filePath) throws IOException {
StringBuilder xmlContent = new StringBuilder();
// 使用BufferedReader逐行读取文件内容
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
xmlContent.append(line);
// 保留换行符,保证XML格式完整
xmlContent.append("n");
}
}
return xmlContent.toString();
}
}
二、建立Socket连接
Java中客户端通过Socket类建立到服务端的TCP连接,需要指定服务端的IP地址和端口号。如果是本地测试,可以使用127.0.0.1作为服务端地址。
import java.io.IOException;
import java.net.Socket;
public class SocketClient {
private String serverIp;
private int serverPort;
private Socket socket;
public SocketClient(String serverIp, int serverPort) {
this.serverIp = serverIp;
this.serverPort = serverPort;
}
// 建立Socket连接
public void connect() throws IOException {
socket = new Socket(serverIp, serverPort);
System.out.println("Socket连接建立成功,服务端地址:" + serverIp + ",端口:" + serverPort);
}
public Socket getSocket() {
return socket;
}
// 关闭连接
public void close() throws IOException {
if (socket != null && !socket.isClosed()) {
socket.close();
System.out.println("Socket连接已关闭");
}
}
}
三、XML报文封装与发送
读取到XML内容后,需要根据通信双方的约定封装XML报文,通常可以在XML内容前后添加长度标识或者固定的报文头,这里演示直接发送XML字符串的场景,使用OutputStreamWriter将字符串写入Socket的输出流。
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class XmlSender {
// 发送XML报文
public static void sendXml(Socket socket, String xmlContent) throws IOException {
// 获取Socket输出流,指定编码为UTF-8避免中文乱码
try (OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8")) {
// 写入XML内容
writer.write(xmlContent);
// 刷新缓冲区,确保数据发送
writer.flush();
System.out.println("XML报文发送完成,内容长度:" + xmlContent.length());
}
}
}
四、完整客户端示例
将前面的几个步骤整合,实现完整的XML文件通过Socket发送的流程,这里以本地测试为例,服务端地址使用127.0.0.1,端口为8888。
import java.io.IOException;
import java.net.Socket;
public class XmlSocketClientDemo {
public static void main(String[] args) {
// 本地XML文件路径
String xmlFilePath = "D:/test.xml";
// 服务端地址和端口
String serverIp = "127.0.0.1";
int serverPort = 8888;
SocketClient socketClient = new SocketClient(serverIp, serverPort);
try {
// 读取XML文件内容
String xmlContent = XmlFileReader.readXmlFile(xmlFilePath);
System.out.println("读取到的XML内容:n" + xmlContent);
// 建立Socket连接
socketClient.connect();
// 发送XML报文
XmlSender.sendXml(socketClient.getSocket(), xmlContent);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接
try {
socketClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五、简单服务端接收示例
为了验证发送效果,这里提供一个简单的服务端代码,用于接收客户端发送的XML报文并打印。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class XmlSocketServerDemo {
public static void main(String[] args) {
int serverPort = 8888;
try (ServerSocket serverSocket = new ServerSocket(serverPort)) {
System.out.println("服务端启动,监听端口:" + serverPort);
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端连接成功,地址:" + clientSocket.getInetAddress());
// 读取客户端发送的XML报文
try (InputStream inputStream = clientSocket.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader)) {
StringBuilder receivedXml = new StringBuilder();
String line;
// 按行读取内容,直到流结束
while ((line = bufferedReader.readLine()) != null) {
receivedXml.append(line);
receivedXml.append("n");
}
System.out.println("接收到的XML报文:n" + receivedXml.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意事项
- XML文件读取时注意指定正确的编码,避免内容乱码,建议统一使用UTF-8编码。
- Socket发送数据后要及时刷新输出流,否则数据可能停留在缓冲区没有发送出去。
- 如果XML报文较大,需要考虑分包发送和接收的处理逻辑,避免数据截断。
- 实际开发中需要根据接口约定添加报文头、校验位等内容,保证报文格式符合通信规范。
- Socket连接使用完毕后要及时关闭,避免资源泄露。
Java_SocketXML报文Socket通信XML文件传输修改时间:2026-07-03 10:54:13