当前位置: 首页 > 知识库问答 >
问题:

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

姬阳曜
2023-03-14

我有这个服务器:

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个答案

能烨华
2023-03-14

还有..它只是少了一行代码

jsonWriter.close();

在JsonWriter.WriteObject之后

不确定如何具体地回答注释,但我希望保持连接打开,以便能够发送更多的消息,而不必每次都重新建立它(但没有进入代码,因为我希望看到一个消息首先工作!)

 类似资料:
  • 问题内容: 我目前在我的项目中使用类型,并且遇到问题。 上面的代码中的可以是或。这是类型的原因。 我知道不是。 我需要知道的是如何使它工作。 问题答案: 可编码需要知道要转换的类型。 首先,我将尝试解决不知道类型的问题,看看是否可以解决它并使它更简单。 否则,我目前认为解决您的问题的唯一方法就是使用如下所示的泛型。

  • 问题内容: 我正在使用poi 3.6 我能够正确创建Excel。但是,当我尝试将单元格类型设置为number时,它总是为我提供常规的单元格类型。 即在新创建的excel中,当我右键单击并设置单元格格式->我总是发现数字是General。 我的代码是这样的 您能建议一下这里缺少什么吗? 问题答案: 您也可以尝试这种方法: 当然,请查看有关数据格式的文档和示例。

  • 控制台输出中的西里尔符号显示不正确。Jenkins正在Windows 7上运行Tomcat/8.5.11 Jenkins属性显示: file.encoding cp1251 sun.jnu.encoding cp1251 sun.stderr.encoding cp866 sun.stdout.encoding cp866 解决了:我在bin文件夹中创建了文件setenv.bat并设置java_o

  • 我使用的是poi 3.6 我能够正确地创建excel。但当我试图将单元格类型设置为数字时,它总是将单元格类型设置为常规。 i、 e.在新创建的excel中,当我右键单击并转到“格式化单元格”时- 我的代码是这样的 你能告诉我这里缺少什么吗?

  • 我试图重置文本框值。试图设置类型字符串|数字的变量,但我得到一个错误。那么如何在打字稿中将两种类型设置为单个变量。请帮助找到解决方案。 错误: 元素[i]. value=值[i]; 类型“string | number”不可分配给类型“string”。类型“number”不可分配给类型“string” 演示:https://stackblitz.com/edit/angular-dzxsg4?fi

  • 问题内容: 在我的Web应用程序中,我使用jQuery的方法提交了一些表单字段。我在编码方面遇到了一些问题。我的应用程序的字符集是,但我认为这些字段是通过提交的。 如何设置通话中使用的编码? 问题答案: 我认为,如果您想更改编码,则可能必须使用,请参见下面的参数(and 回调假定您具有和html中的内容): 我实际上只需要一个小时左右就可以完成,真是巧合!