【发布时间】:2014-07-25 10:39:18
【问题描述】:
我有这个服务器:
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 错误
在哪里可以设置流的编码类型?我应该把它设置成什么?我需要为客户端和服务器都这样做吗?
谢谢,
【问题讨论】:
-
我认为这个问题会对你有所帮助stackoverflow.com/questions/4069028/…
-
为什么要重新发明 HTTP?它已经有处理消息长度的方法。你没有;您希望套接字关闭会导致 EOF。
-
有什么原因你没有在 finally 中关闭你的流吗?