java - 如何使用 javax.json 在 Java steam 中将编码类型设置为 JSON

标签 java json

我有这个服务器:

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/

相关文章:

jquery - JSON:如何进行跨域 JSON 调用

json - 无法使用类型为 'String' 的索引为类型 [Dictionary<String, Any>] 的值下标

java - 是否有任何方法可以在集合上复制原始数组,反之亦然,并自动包装/展开它们?

java - 考虑在您的配置中定义 * 类型的 bean

java - 我想将 "08:30:00"转换为 P00DT08H30M。在java中转换为所需输出的最佳方法是什么?

java - 第二次创建位图时内存不足异常

java - 同步Web服务方法有意义吗?

php - Twitter user_timeline.json 仅显示最新推文,即使计数 = 5

json - Flutter:如何显示包含对象列表的已解析json对象中的数据

javascript - Javascript 如何区分 Json 对象和字符串?