服务器端:
PrintWriter outputStream = new PrintWriter(client.getOutputStream(),true);
BufferedReader inputStream = new BufferedReader(newInputStreamReader(client.getInputStream()));
outputStream.println("hello client");
System.out.println("server got: " + inputStream.readLine());
outputStream.println("to the client");
客户端:
try{
serverSocket = new Socket("machineName", 4444);
out = new PrintWriter(serverSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
}
catch(Exception e){
e.printStackTrace();
}
if ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
fromUser = "I am the user";
out.println(fromUser);
System.out.println("Server: " + in.readLine());
}
我使用这种格式在服务器和客户端套接字之间进行通信。现在我想在客户端和服务器之间发送XML,而不是字符串。我使用DOM在服务器端和客户端解析XML数据。
有没有一种有效的方法可以在客户端和服务器之间传输XML,而不是将XML转换为字符串并从XML数据中删除换行符(因为readLine一次读取一行,XML开始标记和结束标记不会以XML格式出现在一行中),然后通过Printwriter将其发送到客户端。
感谢
这不是家庭作业题。我正在学习用于面试的java套接字。
实际上,XML数据只不过是字符串(但您也可以将其视为二进制数据)。您的问题是发送许多行xml字符串。如果你不想使用第三方库,只需手动操作,这里是一个很好的起点:https://stackoverflow.com/a/2441736/719212.
此示例使用byte stream
通过解析xml来发送和接收xml数据。
查看StAX api。它是为在互联网上传输XML数据而设计的。
流是指一种编程模型,其中XML信息集在应用程序运行时串行传输和解析,通常是真实的时间,通常来自内容不精确的动态来源事先已知
[…]
当您的应用程序有严格的内存限制,就像手机在运行一样Java平台、Micro Edition(Java ME平台),或者应用程序需要同时处理多个请求,如应用服务器。
文档中的更多内容:http://docs.oracle.com/javase/tutorial/jaxp/stax/why.html
您可以使用Exificient 将XML转换为压缩的二进制数据
EXI格式是可扩展标记语言(XML)信息集的一种非常紧凑的表示,旨在同时优化性能和计算资源的利用率。