OutputStream не работает после InputStream - PullRequest
1 голос
/ 24 сентября 2019

Я довольно новичок в сокетах и ​​в J2ME, и я хочу создать приложение, которое будет отправлять некоторый текст на сервер (через сокет), а затем получать ответ.Поэтому, когда я пытаюсь записать вывод, я получаю исключение:

java.net.SocketException: Socket is closed
    at java.net.Socket.getOutputStream(Socket.java:943)
    at server.run(server.java:55)
    at java.lang.Thread.run(Thread.java:748)

Вот мой код сервера (метод run ()):

public void run() {
        try {
            serverSocket = new ServerSocket(7997);
            while (true) {
                try {
                    Socket socket = serverSocket.accept();
                    System.out.println("connected");
                    InputStream in = socket.getInputStream();
                    String str = readAll(in);
                    in.close();
                    System.out.println(str);
                    JSONParser parser = new JSONParser();
                    JSONObject json = null;
                    json = (JSONObject) parser.parse(str);
                    text = (String) json.get("text");
                    presalt = (String) json.get("salt");
                    keytoCipher = (String) json.get("key2");
                    String presdvig = (String) json.get("key1");
                    sdvig = Long.parseLong(presdvig);
                    //some methods that work with input
                    caesarEncode();
                    ConKey();
                    precipher();
                    base64code();
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write(ciphered.getBytes());
                    outputStream.flush();
                    outputStream.close();
                } catch (ParseException | IOException e) {
                    e.printStackTrace();
                }
            }
            //serverSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

И это J2MEкод клиента:

try {
                    System.out.println("connected");
                    JSONObject json = new JSONObject();
                   json.put("text", textField.getString());
                   json.put("salt", "defaultsalt");
                   json.put("key1", "228");
                   json.put("key2", "1488");
                    OutputStream out = sc.openOutputStream();
                    out.write(json.toString().getBytes());
                    out.flush();
                    out.close();
                    InputStream in = sc.openInputStream();
                  String str = readAll(in);
                  System.out.println(str);
                    fieldzwei.setString(str);
                } catch (IOException ex) {
                    ex.printStackTrace();
                } catch (JSONException ex) {
                    ex.printStackTrace();
                }

Кроме того, если я ничего не отправляю на сервер и просто отправляю сообщение с него, когда он подключен, он работает нормально.Есть идеи, где я могу ошибаться?

1 Ответ

2 голосов
/ 24 сентября 2019

Проблема здесь в том, что вы закрываете InputStream, возвращаемое Socket.getInputStream():

InputStream in = socket.getInputStream();
String str = readAll(in);
in.close();

Из Javadoc Socket.getInputStream():

Закрытие возвращенного InputStream закроет связанный сокет.

Так что после выполнения кода выше ваш сокет будет закрыт.

tl; dr :Не закрывайте InputStream, если вам все еще нужен OutputStream.

...