客户端 - 服务器模式下的InputStreamReader和OutputStreamWriter

时间:2018-05-15 08:25:45

标签: java

我必须在不使用NIO的情况下实现客户端 - 服务器应用程序。 客户端向服务器发送请求(在JSON中),然后服务器发送响应。

问题在于响应,因为如果客户端发送请求并且服务器没有发送响应,则它可以正常工作。

客户端和服务器端的

我使用InputStreamReaderOutputStreamWriter。如果我在服务器上读写是正常的,但如果我将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);

从客户端,服务器可以发送响应,但自然没有人读过这个

有人可以告诉我这是什么问题吗?

1 个答案:

答案 0 :(得分:1)

我认为原因是您的客户端和服务器被禁止读取,因为它正在读取直到EOF。在关闭套接字或关闭OutPutStream之前,您不会收到EOF。如果只是一次性写入,您可能希望在写入后立即关闭OutPutStream。 out.write(obj.toJSONString()); out.flush(); socket.shutdownOutput();