繁体   English   中英

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

[英]How to set encoding type to JSON in Java steam using javax.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();
        }

    }
}

当我运行两个服务器(首先是服务器)时,我得到以下结果:

线程“主”中的异常javax.json.JsonException:自动检测流的编码时发生I / O错误

在哪里可以设置流的编码类型? 我应该设置为什么? 客户端和服务器都需要这样做吗?

谢谢,

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

jsonWriter.close();

在jsonWriter.writeObject之后

不确定如何具体回答评论,但是我想保持连接打开状态,以便能够发送更多消息而无需每次都重新建立连接(但是我没有看到该代码,因为我想首先看到一条消息!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM