0

基本的に、私は両側の間でソケット接続を行っています。Java サーバーと Android クライアント。Gson ライブラリを使用してオブジェクトを String Json に変換し、Android クライアントからメソッド WriteUTF を介してそれらを送信しています。しかし、Java サーバーで応答を取得しようとすると、「java.io.DataInputStream.readUnsignedShort(Unknown Source) で java.io.EOFException」が発生します。このメソッド (readUnsignedShort) を使用しなかった場合、または Short を送信しなかった場合はどうすればよいでしょうか? ここにコードがあります。

Android クライアントからの書き込み:

 try {
                DataInputStream in = new DataInputStream (s3.getInputStream());
                DataOutputStream out = new DataOutputStream(s3.getOutputStream());

                ap = (ArrayList<Produto>) InternalStorage.readObject(getBaseContext(),"pedido");

                 for(int i=0;i<ap.size()&& ap.size()>0;i++){

                        Produto p = new Produto("", "", 0f, "", "", 0);
                        p = ap.get(i);
                        Gson gson = new Gson();
                        String json = gson.toJson(p);
                        out.writeUTF(json);
                        out.flush();

                    }

Javaサーバーからの読み取り:

try {
        // Get input from the client
        DataInputStream in = new DataInputStream (server.getInputStream());
        DataOutputStream out = new DataOutputStream(server.getOutputStream());


        while((line = in.readUTF()) != null) {
            boolean error = false;

            String json = line;
            Gson gson = new Gson();
            Produto p2 = gson.fromJson(json, Produto.class);
            c = dbDelegate.getCommandByNumber(p2.getMesa());
            p = dbDelegate.getProductByName(p2.getNome());
            if(c!=null && p!=null){
                error = false;
            inCommand.setCommand(c);
            inCommand.setDateAndTime(new Timestamp(System.currentTimeMillis()));
            inCommand.setProduct(p);
            inCommand.setLogin(FishingBoardFrameCashRegister.getInstance().getLogin());
            inCommand.setQuantity(p2.getQuantidade());
            inCommand.setPrice(String.valueOf((p2.getValor()*p2.getQuantidade())));
            inCommand.setObs(p2.getObs());
            inCommand.setProductName(p.getName());
            inCommand.setType(Product.ALL);
            inCommand.setSession(0);
            inCommand.setCommandSession(c.getSession());
            if(dbDelegate.insertProductInCommand(inCommand) == DbDelegate.CASH_CLOSED){
                error = true;
            }
            FishingBoardFrameCashRegister.getInstance().updateTable();
            }else{
                error = true;
            }

ログも役立つ場合があります。

trueIOException on socket listen: java.io.EOFException
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at com.keymax.server.doComms3.run(Server3.java:71)

Server3.java:71 はサーバー コードの次の行です: while((line = in.readUTF()) != null) {

4

1 に答える 1

0

EOFExceptionここでは が期待されていると思います。これは、呼び出しreadUTFてデータが残っていない場合に得られるものだからです。

writeIntループの前に使用して、書き込まれる文字列の数を書き出してから、もう一方の端で使用して、ストリームで実際に使用可能な文字列の数よりも多くの回数をreadInt呼び出さないようにすることで、これを修正します。readUTF

writeUTFおそらく、文字列の長さを書き込み、次に文字列にデータを書き込みます。これはreadUnsignedShortEOFException.

于 2014-02-07T14:13:53.200 に答える