1

streamCorruptedExceptionサーバーからオブジェクトを取得しようとすると、クライアントで が取得されます。

最初はクライアントがサーバーに接続するとうまくいきますが、2 番目のクライアントに接続しようとすると、または 2 回目に実行するとエラーが発生します。サーバー側でストリームをリセットしようとしましたが、うまくいきませんでした。 編集済み:

以下は私のサーバーコードです:

       Socket clientSocket=null;
            BufferedReader rdr=null;
            ObjectOutputStream objwriter=null;
            String name="";
            audioReceiver = new TAudioReceiver(ser);
            videoReceiver = new TVideoReceiver(ser);
            fileReceiver = new TFileReceiver(ser);
            //audioReceiver.start();
            //videoReceiver.start();
            //fileReceiver.start();
            InputStream cliIn=null;
            OutputStream cliOut = null;
            ClientDetails client=null;


            while(true)
            {
                objwriter=null;
                clientSocket = ser.MainSocket().accept();
                cliIn = clientSocket.getInputStream();
                cliOut = clientSocket.getOutputStream();
                client = new ClientDetails(clientSocket);
                rdr= new BufferedReader( new InputStreamReader(cliIn));
                name = rdr.readLine();
                System.out.println("Client connected '"+ name +"'");

                boolean a = ser.clientsMainSockets.AddClient(name, client);
                if(a){
                    ser.clientsNames = ser.clientsMainSockets.ClientNames();

                    wr = new BufferedWriter(new OutputStreamWriter(cliOut));
                    wr.write("OKM");
                    wr.write('\n');
                    wr.flush();
                    objwriter = new ObjectOutputStream(cliOut);
                    //Thread.sleep(1000);
                    objwriter.writeObject(ser.clientsNames);
                    objwriter.flush();
                    clientSocket =null;
                    cliIn = null;
                    cliOut = null;

                    client = ser.clientsMainSockets.Value(name);

                    TMessageHandler msghdl = new TMessageHandler(ser, client.InputStream() , client.OutputStream(), name);
                    clientHandler.add(msghdl);
                    msghdl.start();
                    System.out.println("Starting process for client");
                    objwriter.reset();
                    Thread.sleep(5000);
                }
                else{

                        wr = new BufferedWriter(new OutputStreamWriter(cliOut));
                        wr.write("ERROR");
                        wr.write('\n');
                        wr.flush();
                }


            }
    }
    catch(Exception ex)
    {
    }

以下はクライアントコードです:

 mainSock = new Socket(serverIp,serMainPort);
            serOut = mainSock.getOutputStream();
            serIn = mainSock.getInputStream();
            buffWr= new BufferedWriter(new OutputStreamWriter(serOut));
            //serOut = mainSock.getOutputStream();
            //serIn = mainSock.getInputStream();
            buffWr.write(myName);
            buffWr.write('\n');
            buffWr.flush();
            buffRdr = new BufferedReader(new InputStreamReader(serIn));
            String per="";
            per = buffRdr.readLine();
            System.out.println(per);
            if(per.equals("OKM"))
            {

                objin = new ObjectInputStream(serIn);
                ClientsName = (String[])objin.readObject();
                System.out.println("Client no.'"+ ClientsName.length );
                msgHandler = new TMainHandler(this, serOut, serIn);
                msgHandler.start();
            }
            else {
                throw new Exception("User Already exisits. Choose Another name.");
            }
        }
        catch(Exception ex)
        {
            throw new Exception(ex.getMessage());
        }
4

1 に答える 1

1

テキスト ストリームとバイナリ ストリームを混在させないでください。何をしているのか本当によくわかっていない限り、混乱を招くことがよくあります。

ストリームの存続期間中は一度ラップmainSock.getInputStream()して、それのみを使用することをお勧めします。つまり、複数回呼び出さないでください。mainSocket.getOutputStream()

于 2013-01-23T18:29:36.200 に答える