我有这个服务器:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.json.Json;
import javax.json.stream.JsonParser;
public class TestServer
{
static ServerSocket serverSocket = null;
static boolean done = false;
public static void main(String[] args)
{
try
{
serverSocket = new ServerSocket(9995);
// windows cmd: netstat -a -b -n | findstr 9995
}
catch (Exception e)
{
e.printStackTrace();
}
while (!done)
{
System.out.println("accepting connections on port " + serverSocket.getLocalPort());
try
{
Socket clientSocket = serverSocket.accept();
System.out.println("connection accepted");
Thread temp = new Thread(new ClientHandler(clientSocket));
temp.run();
}
catch (IOException e)
{
if (!done)
{
e.printStackTrace();
}
}
}
}// end main
}
class ClientHandler implements Runnable
{
Socket connection;
JsonParser parser;
ClientHandler(Socket connection)
{
this.connection = connection;
}
public void run()
{
System.out.println("someone connected from " + connection.getLocalAddress());
// http://docs.oracle.com/javaee/7/tutorial/doc/jsonp004.htm
try
{
parser = Json.createParser(connection.getInputStream());
while (connection.isConnected())
{
while (parser.hasNext())
{
JsonParser.Event event = parser.next();
switch (event)
{
case START_ARRAY:
case END_ARRAY:
case START_OBJECT:
case END_OBJECT:
case VALUE_FALSE:
case VALUE_NULL:
case VALUE_TRUE:
System.out.println(event.toString());
break;
case KEY_NAME:
System.out.print(event.toString() + " "
+ parser.getString() + " - ");
break;
case VALUE_STRING:
case VALUE_NUMBER:
System.out.println(event.toString() + " "
+ parser.getString());
break;
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}// end ClientHandler
还有这个客户:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.json.*;
import javax.json.JsonWriter;
public class TestClient
{
static Socket s;
static OutputStream output;
static InputStream input;
public static void main(String[] args)
{
try
{
s = new Socket("localhost", 9995);
output = s.getOutputStream();
input = s.getInputStream();
JsonWriter jsonWriter = Json.createWriter(output);
JsonObject hello = Json.createObjectBuilder()
.add("firstName", "Duke")
.add("lastName", "Java")
.add("age", 18)
.add("streetAddress", "100 Internet Dr")
.add("city", "JavaTown")
.add("state", "JA")
.add("postalCode", "12345")
.add("phoneNumbers", Json.createArrayBuilder()
.add(Json.createObjectBuilder()
.add("type", "mobile")
.add("number", "111-111-1111"))
.add(Json.createObjectBuilder()
.add("type", "home")
.add("number", "222-222-2222")))
.build();
jsonWriter.writeObject(hello);
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当我运行这两个(首先是服务器)时,我最终得到以下结果:
线程“main”javax.json.JsonException中出现异常:自动检测流编码时发生I/O错误
哪里可以设置码流的编码类型?我应该将其设置为什么?我需要为客户端和服务器都执行此操作吗?
谢谢
最佳答案
而且......它只是缺少一行代码:
jsonWriter.close();
在 jsonWriter.writeObject 之后
不知道如何具体回答评论,但我想保持连接打开,以便能够发送更多消息,而无需每次重新建立连接(但没有到达该代码,因为我想看到单个先留言工作!)
关于java - 如何使用 javax.json 在 Java steam 中将编码类型设置为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24043206/