繁体   English   中英

套接字ObjectOutpuStream ObjectInputStream

[英]Socket ObjectOutpuStream ObjectInputStream

我正在编写简单的客户端-服务器应用程序。 一切正常,但是当我将InputStream和OutputStream更改为ObjectOutputStream和ObjectInputStream时,我的应用程序不发送消息。 谁能帮我看看问题所在?

这是Serwer.java:

class InWorke implements Runnable{

    BufferedReader odczyt=null;
    String slowo;
    ObjectInputStream ois=null;
    Message message;

    InWorke(ObjectInputStream ois) {
        this.ois=ois;
    }

    public void run() {
        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();
            }
            System.out.println(slowo);
            Thread.yield();
        }               }

}

class OutWorke implements Runnable{
    Socket socket=null;
    BufferedReader odczytWe=null;
    DataOutputStream zapis=null;
    String slowo=null;
    Message message; // it is the simple class to serialization
    ObjectOutputStream oos;

    OutWorke(Socket socket,ObjectOutputStream oos) {
        this.socket=socket;
        this.oos=oos;
    }

    public void run() {
        while(true) {
            odczytWe=new BufferedReader(new InputStreamReader(System.in));
            try {
                slowo=odczytWe.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                    oos.writeObject(slowo);
                    oos.flush();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            Thread.yield();

    }

}
}

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

    Socket socket=null;
    ExecutorService exec=Executors.newCachedThreadPool();

    ObjectOutputStream oos=null;
    ObjectInputStream ois=null;

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

    exec.execute(new OutWorke(socket, oos));
    exec.execute(new InWorke(ois));

 }
} 

Klient.java:

class InWorker implements Runnable{

    Socket socket=null;
    //InputStream we=null;
    //OutputStream wy=null;
    String slowo=null;
    BufferedReader odczyt=null;
    ObjectOutputStream oos;
    ObjectInputStream ois;
    Message message=null;

    InWorker(Socket socket,ObjectInputStream ois) {
        this.socket=socket;
        this.ois=ois;
    }

    public void run() {
                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();
                }
                System.out.println(slowo);
                Thread.yield();
            }

            }
}

class OutWorker implements Runnable{

    DataOutputStream zapis=null;
    BufferedReader odczyt=null;
    //OutputStream wy=null;
    String tekst=null;
    ObjectOutputStream oos=null;
    Message message;

    OutWorker(ObjectOutputStream oos) {
        this.oos=oos;
    }

    public void run() {
        while(true) {
        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();
        }
        Thread.yield();
        }
    }

}

public class Serwer {

    public static void main(String[] args) {
        ServerSocket serversocket=null;
        Socket socket=null;
        //InputStream we=null;
        //OutputStream wy=null;
        ObjectOutputStream oos=null;
        ObjectInputStream ois=null;

        ExecutorService exec=Executors.newCachedThreadPool();

        try {
            serversocket=new ServerSocket(8881);
        } 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();
        }
        exec.execute(new InWorker(socket, ois));
        exec.execute(new OutWorker(oos));

    }

}

检查ObjectInputStream 构造函数构造函数
它说:

该构造函数将阻塞,直到相应的ObjectOutputStream写入并刷新了头为止。

因此,您需要创建并刷新相应的ObjectOutputStream。 现在,您要在服务器和客户端的输出流之前创建ObjectInputStreams。 它们阻止程序,因为未创建任何输出流。 您应该首先创建输出流,对它们调用flush ,然后才创建输入流。

根本问题正如Nikita指出的那样。 实现解决方案是让服务器和客户端以相反的顺序获取输入和输出流。 如果一个首先获取输入流,另一个获取输出流,依此类推。我切换了客户端,使其首先获取了输出流,并且一切正常。 然后,我将其放回原处并更改服务器,并且所有方法都可以通过...来进行选择。

供参考: http : //docs.oracle.com/javase/6/docs/api/index.html?java/io/ObjectOutputStream.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM