我必须在不使用NIO的情况下实现客户端 - 服务器应用程序。 客户端向服务器发送请求(在JSON中),然后服务器发送响应。
问题在于响应,因为如果客户端发送请求并且服务器没有发送响应,则它可以正常工作。
客户端和服务器端的我使用InputStreamReader
和OutputStreamWriter
。如果我在服务器上读写是正常的,但如果我将InputStreamReader
放在客户端中以读取响应,则服务器不会读取客户端的先前请求。
我把部分代码
System.out.println("eleborazione richiesta");
JSONParser parser = new JSONParser();
Object obj;
try{
InputStreamReader in = new InputStreamReader(this.csocket.getInputStream(), StandardCharsets.UTF_8);
OutputStreamWriter out = new OutputStreamWriter(this.csocket.getOutputStream(), StandardCharsets.UTF_8);
obj =parser.parse(in);
JSONObject jsonObj = (JSONObject) obj;
String richiesta= (String) jsonObj.get("request");
System.out.println("qui");
if(richiesta==null)return;
if(richiesta.equals("register")){//REGISTRAZIONE
ArrayList<String> parametri = null;
JSONArray list = (JSONArray) jsonObj.get("parametri");
if(list!=null) {
Iterator<String> iterator = list.iterator();
parametri =new ArrayList<String>(list.size());
while(iterator.hasNext()){
parametri.add(iterator.next());
}
}
System.out.println("richiesta "+ richiesta + " nickname " + parametri.get(0) + " lingua " + parametri.get(1));
if(utenti.get(parametri.get(0))!=null){
System.out.println("utente già presente");
}else{
utenti.put(parametri.get(0),(new Utenti( parametri.get(0), parametri.get(1))));
System.out.println("aggiunto");
}
JSONObject object= new JSONObject();
object.put("response","ok");
out.write(object.toJSONString());
out.flush();
System.out.println("mandata risposta");
}
...
客户端
SocketAddress address = new InetSocketAddress("localhost", 1234);
Socket client =null;
try {
client = new Socket("localhost", 1234);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JSONObject obj = new JSONObject();
obj.put("request","register");
JSONArray list = new JSONArray();
list.add("nick");
list.add("lingua");
obj.put("parametri", list);
try (OutputStreamWriter out = new OutputStreamWriter(client.getOutputStream(), StandardCharsets.UTF_8))
{
InputStreamReader in = new InputStreamReader(client.getInputStream(), StandardCharsets.UTF_8);
out.write(obj.toJSONString());
//out.flush();
//out.close();
Thread.sleep(2000);
JSONParser parser = new JSONParser();
Object response =parser.parse(in);
JSONObject jsonObj = (JSONObject) response;
String resp= (String) jsonObj.get("response");
System.out.println(resp);
如果执行此操作,则仅打印服务器
client connesso
eleborazione richiesta
如果我删除
JSONParser parser = new JSONParser();
Object response =parser.parse(in);
JSONObject jsonObj = (JSONObject) response;
String resp= (String) jsonObj.get("response");
System.out.println(resp);
从客户端,服务器可以发送响应,但自然没有人读过这个
有人可以告诉我这是什么问题吗?
答案 0 :(得分:1)
我认为原因是您的客户端和服务器被禁止读取,因为它正在读取直到EOF。在关闭套接字或关闭OutPutStream之前,您不会收到EOF。如果只是一次性写入,您可能希望在写入后立即关闭OutPutStream。
out.write(obj.toJSONString());
out.flush();
socket.shutdownOutput();