

  * 下記のコードでは○×問題（オーとエックス)でしか回答できないようになっています。
  * 記述問題を作成したいのですが、getInputStreamのreadをどのように使えばよいか教えていただきたいです。

[code]

    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class Main {
    
        public static void main(String[] args) {
            // TODO 自動生成されたメソッド・スタブ
            System.out.println("起動完了");
            ServerSocket svSock = null;
            Socket sock = null;
            BufferedWriter w = null;
            try {
                svSock = new ServerSocket(300);
                sock =svSock.accept();
                System.out.println(sock.getInetAddress() + "から接続");
                sock.getOutputStream().write("クイズ出題を開始します\r\n".getBytes("SJIS"));
                //sock.getOutputStream().write("\n".getBytes("SJIS"));
                sock.getOutputStream().write("Javaはコンパイラ言語ですか\r\n".getBytes("SJIS"));
                sock.getOutputStream().flush();
                int ans = sock.getInputStream().read();
                if(String.valueOf((char)ans).equals("o")) {
                    sock.getOutputStream().write("\r\n正解".getBytes("SJIS"));
                }else {
                    sock.getOutputStream().write("\r\n不正解".getBytes("SJIS"));
                }
    
            } catch (IOException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }finally {
                try {
                    sock.close();
                } catch (IOException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    
[/code]


CC BY-SA 4.0
2021-05-31T01:37:05.330
76213
2021-05-31T05:07:54.987
2021-05-31T01:44:03.403
3060
41769
question
java
Javaでのネットワーク接続での文字列でのgetInputStream使用方法


SO本家の[類似質問](https://stackoverflow.com/q/15480894)のように[BufferedReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedReader.html)と[Socket#getInputStream](https://docs.oracle.com/javase/jp/8/docs/api/java/net/Socket.html#getInputStream--)を組み合わせて使うと1行分のデータを読み込むことができます。

**サーバ側のサンプルコード** (ご質問にあるMainクラスから抜粋して改変)

[code]

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Main {
        public static void main(String[] args) {
            try (ServerSocket svSock = new ServerSocket(300);
                 Socket sock = svSock.accept();
                 //バッファを使って入力を読み込む
                 BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()))) {
                //改行コードまでデータ読込
                System.out.println(in.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
[/code]

**クライアント側のサンプルコード**

[code]

    import java.net.Socket;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    
    public class Sender {
        public static void main(String[] args) {
            try (Socket socket = new Socket("localhost", 300);
                 OutputStream output = socket.getOutputStream();
                 //エンコーディングは任意のものに変えること
                 OutputStreamWriter writer = new OutputStreamWriter(output, "Shift-JIS");
                 InputStream input = socket.getInputStream()) {
                String s = "こんにちは, socket!\n";
                for (char ch : s.toCharArray()) {
                    writer.write(ch);
                }
                writer.flush();
                //サーバ処理待ちを適当に行う
                int c;
                while ((c = input.read()) != -1) {}
            } catch (Exception e) {
                System.out.println("occured Exception.");
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-05-31T05:07:54.987
76218
2021-05-31T05:07:54.987
9820
76213
answer