簡體   English   中英

通過ObjectInputStream(Java)接收對象

[英]Recieving objects through ObjectInputStream (Java)

它是Java中的Messenger應用程序。 我想發送對象而不只是文本,我認為它要好得多。 我為每個連接的客戶端使用一個ServerSocketChannel和一個新線程。
-相同的包,相同的構造函數,相同的serialVersionUID 它只是打印出“之前”命令,無法讀取客戶端的對象。

服務器代碼的一部分:

    public static void startServer(){
        try{
            ServerSocketChannel ssc=ServerSocketChannel.open();
            ssc.socket().bind(new InetSocketAddress(hostName,portNumber));
            while(isServerRunning()){
                removeLoggedOutClients();
                try{
                    SocketChannel sc=ssc.accept();
                    Socket s=sc.socket();
                    ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
                    Client cli=null;
                    System.out.println("before");
                    cli=(Client)ois.readObject();
                    System.out.println("after");
                    ois.close();
                    if(checkLogin(cli)){
                        System.out.println(cli.getUsername()+" signed in.");
                        cli.setSocket(s);
                        ClientThread ct=new ClientThread(s,cli.getClientID());
                        ct.setDaemon(true);
                        clientThreads.add(ct);
                        ct.start();
                    }
                }
                catch(Exception e){
                    Error err=new Error("Server","void startServer()",2,e.toString());
                }
            }
        }
        catch(Exception e){
            Error err=new Error("Server","void startServer()",1,e.toString());
        }
    }

客戶代碼的一部分:

    public static void connectToServer(Client user){
        try{
            SocketChannel sc=SocketChannel.open();
            sc.configureBlocking(true);
            sc.connect(new InetSocketAddress(serverHostName,serverPortNumber));
            Socket s=sc.socket();
            ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
            ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
            oos.writeObject(user);
            oos.flush();
            RecieveThread rt=new RecieveThread(s,ois,user);
            rt.setDaemon(true);
            rt.start();
            setOut(oos);
        }
        catch(Exception e){
            Error err=new Error("Client","connectToServer(Client user)",1,e.toString());
        }
    }

(我的“ Error”類的目的是將所有可能的異常插入數據庫。)

主要問題是您要在客戶端中創建ObjectInputStream :這將阻塞,直到在對等ObjectOutputStream創建ObjectOutputStream ,並且您沒有創建(至少不在發布的代碼中)。 您需要立即在兩端按順序創建ObjectOutputStreamObjectInputStream,

但是,您還有其他問題。 除了接受連接之外,您不應該在accept循環中執行任何I / O操作。 所有對象流的創建,登錄等都應在創建用於處理連接的線程中完成,並且NB不在其構造函數中,而是在其run()方法中。 否則,一個無賴或故障的客戶端可能會阻塞整個系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM