0

私は単純なクライアントサーバーアプリケーションを書いていますが、これにはばかげた問題があります(例を単純化します(Javaシリアライゼーションを使用しない場合はすべて問題ありません)):

    ServerSocket serversocket=null;
    Socket socket=null;    
    String slowo=null;

    try {
        serversocket=new ServerSocket(8877);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        socket=serversocket.accept();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    slowo=(String)ois.readObject();

私のコンパイラは次のことを示しています:

Serwer.java:51: cannot find symbol
symbol  : variable ois
location: class Serwer
slowo=(String)ois.readObject();
                      ^
1 error

誰でも助けることができますか?

もう1つ質問があります。このプログラムがメッセージを送信しないのはなぜですか?

サーバー.java:

パブリック クラス サーバー {

public static void main(String[] args) {
    ServerSocket serversocket=null;
    Socket socket=null;
    InputStream we=null;
    OutputStream wy=null;
    BufferedReader odczyt=null;
    BufferedReader odczytWe=null;
    DataOutputStream zapis=null;
    String slowo=null;
    String tekst=null;

    ObjectInputStream ois=null;
    ObjectOutputStream oos=null;

    try {
        serversocket=new ServerSocket(8877);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        socket=serversocket.accept();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        oos=new ObjectOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //slowo=(String)ois.readObject();

    while(true) {
        try {
            slowo=(String) ois.readObject();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        if(slowo==null || slowo.equals("end")) {
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.exit(0);
        }
        else if(slowo!=null) {
            System.out.println(slowo);
        }

            odczyt=new BufferedReader(new InputStreamReader(System.in));
            try {
                tekst=odczyt.readLine();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                oos.writeObject(tekst);
                oos.flush();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            }

}

}

クライアント.java:

public class Klient {
public static void main(String[] args) {

Socket socket=null;
InputStream we=null;
OutputStream wy=null;
BufferedReader odczyt=null;
BufferedReader odczytWe=null;
DataOutputStream zapis=null;
String slowo=null;
String tekst=null;
ObjectInputStream ois=null;
ObjectOutputStream  oos=null;

try {
    socket=new Socket("localhost", 8877);
} catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
try {
    ois=new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
try {
    oos=new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

while(true) {
    try {
        slowo=(String) ois.readObject();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    if(slowo==null || slowo.equals("end")) {
        try {
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.exit(0);
    }
    else if(slowo!=null) {
        System.out.println(slowo);
    }

        odczyt=new BufferedReader(new InputStreamReader(System.in));
        try {
            tekst=odczyt.readLine();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            oos.writeObject(tekst);
            oos.flush();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

}

} 

}

4

1 に答える 1

6

前の試行で宣言しているため、51 行目に到達するまでにスコープ外になります。

宣言を両方の外に移動するか、コードを別の方法で記述します。

このスタイルは雑然としていて読みにくいと思います。私は次のように書きます:

ServerSocket serversocket=null;
String slowo="";
try {
    serversocket=new ServerSocket(8877);
    Socket socket = serversocket.accept();
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
    slowo=(String)ois.readObject();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    close(serversocket);
}

悪い IDE に悪いコードを書かせないでください。

最終ブロックでソケットを閉じる必要があります。

于 2013-01-08T12:37:08.157 に答える