写UTF和读UTF,我怎么能写一个字符串并在另一边得到一个简短的异常



基本上我在两边之间做一个套接字连接。一个 Java 服务器和一个 Android 客户端。我正在使用Gson库将对象转换为字符串Json,并通过Android客户端的方法WriteUTF发送它们。但是当我尝试在Java服务器中获得响应时,我得到一个"java.io.EOFException at java.io.DataInputStream.readUnsignedShort(未知来源)"。如果我没有使用这种方法(readUnsignedShort),甚至没有发送任何 Short ?代码来了。

从安卓客户端写入:

 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) {

我认为这里应该有EOFException,因为如果你打电话给readUTF并且没有数据,你会得到的。

我会通过在循环之前使用 writeInt 写出要写入的字符串数,然后在另一端readInt来解决此问题,这样您调用readUTF的次数就不会超过流中实际可用的字符串数。

writeUTF可能会写入字符串的长度,然后写入字符串中的数据,这就解释了为什么readUnsignedShort是获得EOFException的人。

相关内容

  • 没有找到相关文章

最新更新