找不到符号ois

时间:2013-01-08 12:35:33

标签: java serialization objectoutputstream objectinputstream

我正在编写简单的客户端 - 服务器应用程序,但我有这个愚蠢的问题(它简化了示例(当我不使用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

有人可以帮忙吗?

我还有一个问题。为什么这个程序不发送消息?

Serwer.java:

公共课Serwer {

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();
            }
            }

}

}

Klient.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();
        }

}

} 

}

1 个答案:

答案 0 :(得分: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为你写错代码。

您应该在finally块中关闭套接字。