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

时间:2014-06-04 16:51:57

标签: 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错误

在哪里可以设置流的编码类型?我该怎么设置它?我是否需要为客户端和服务器执行此操作?

谢谢,

1 个答案:

答案 0 :(得分:3)

而且......它只缺少一行代码:

jsonWriter.close();

在jsonWriter.writeObject

之后

不确定如何专门回答评论,但我希望保持连接打开,以便能够发送更多消息而无需每次都重新建立它(但是没有达到我希望看到的代码单个消息首先工作!)