当前位置: 首页 > 知识库问答 >
问题:

例外情况:管道破裂

段干帅
2023-03-14

我正在实现与Android应用程序通信的服务器端应用程序。Android应用程序在最初与C服务器通信之前就已经实现了。现在我想用java代码替换C服务器。Android应用程序与服务器进行通信,通过读卡器中的卡对此人进行身份验证。

身份验证协议包含应用程序和服务器之间要成功完成的几个通信步骤。

应用程序和服务器之间的消息格式如下:

<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 [<data>]
  1. 首先,应用程序发送一个类型1的请求来建立与读卡器中sim卡的连接。
  2. 然后服务器上的clientSocket发送一个类型为0的回复,表示报头已经收到了最后一条消息。
  3. 之后,服务器收到类型2的新请求,将sim卡的ATR(回答Rest)发送到应用程序。
  4. 服务器的clientSocket向应用程序发送类型2的消息. . . . . . . . . . . . . .

最后,我想关闭服务器端的clientSocket和serverSocket。

我添加了重要的代码

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.Arrays;


public class Test {

    private final static int RECEIVE_BUFFER_LENGTH = 512;
    public final static int MESSAGE_MAXIMUM_LENGTH = 256;
    private final static int MESSAGE_HEADER_LENGTH = 8;


    public static void main(String args[]) throws Exception {
        ServerSocket serverSocket = new ServerSocket(3003);
        while (true) {
            Socket clientSocket = serverSocket.accept();
            ByteBuffer receiveBuffer = ByteBuffer.allocate(Test.RECEIVE_BUFFER_LENGTH);
            int readBytes = 0;
            InputStream bufferedInputStream = new BufferedInputStream(clientSocket.getInputStream());
            while (true) {
                ByteBuffer answerBuffer = null;
                readBytes = bufferedInputStream.read(receiveBuffer.array(), receiveBuffer.position(),
                        receiveBuffer.remaining());
                System.out.println("readBytes: " + readBytes); // Here I am getting 9 then -1.
                if (readBytes < 0) {
                    break;
                }
                // Here I am processing the message.
                // .......
                // after ending the processing send a reponse to the Android app.

                try {
                    answerBuffer = ByteBuffer.allocate(Test.MESSAGE_HEADER_LENGTH);
                    answerBuffer.put((byte) 0x00); // at position 0
                    DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream());
                    dOut.writeBytes(Arrays.toString(answerBuffer.array()));
                    dOut.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                System.out.println("The sent answer to the client:  " + Arrays.toString(answerBuffer.array()));
            }

        }
    }

}

产出:

readBytes: 9
The sent answer to the client:  [0, 0, 0, 0, 0, 0, 0, 0]
readBytes: -1

错误我在android应用程序中遇到以下错误:

例外情况:管道破裂

共有1个答案

曹骞仕
2023-03-14

你这是小题大做。以下是简单的方法

Socket clientSocket = serverSocket.accept();
byte[] receiveBuffer = new byte[Test.RECEIVE_BUFFER_LENGTH];
InputStream bufferedInputStream = new BufferedInputStream(clientSocket.getInputStream());
while (true) {
    int readBytes = bufferedInputStream.read(receiveBuffer);
    System.out.println("readBytes: " + readBytes); // Here I am getting 9 then -1.
    if (readBytes < 0) {
        break;
    }
    // Here you need to process `receiveBuffer[0..readBytes-1],
    //  and note that it may not contain a complete message,
    // so you may have to do more reading.
    // ...
    // after ending the processing send a reponse to the Android app.

    try {
        byte[]    answerBuffer = {0x00};
        clientSocket.getOutputStream().write(answerBuffer);
        System.out.println("Sent answer to the client");
    } catch (IOException e) {
            e.printStackTrace();
    }
}
clientSocket.close();

目前,您正在发送完整的垃圾邮件,因为所有无意义和不正确的ByteBuffers

但是,如果这是正确的:

<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 [<data>]

你不会送的。类型为0的正确消息肯定如下所示:

0x00 0x00 0x000 0x000 0x00 0x00 0x00

其中前三个字节是类型,后三个字节是数据长度,显然是零。代码如下所示:

byte[] answerBuffer = {0,0,0,0,0,0};
 类似资料:
  • 我有一个非常奇怪的问题,我希望你的眼睛能帮助解决它。 我定义了一个函数,它通过BASH连接到Oracle SQL数据库。连接后,我使用一个herdeoc传入一个简单的select语句,该语句查找最大订阅id并递增它,具体取决于函数被调用的次数。代码如下: 在命令行调用函数时,上述代码非常有效: 但是,当函数通过管道传输到AWK语句时,函数不再抖动,这毫无意义!请参阅下面的输出: 我不明白。哈哈,我

  • 我有一个开关案例,我想用双管引导3个不同的可能案例到一个结果。

  • 我正在对一个由zuul代理服务支持的简单Spring云应用程序进行一些压力测试。由于Zuul和服务之间的旧连接,我们偶尔会出现管道异常。我使用不同的配置选项配置Zuul,但没有成功: 例外情况如下: 通用域名格式。netflix。祖尔。例外ZuulException:组织转发错误。springframework。云netflix。祖尔。过滤器。路线RibbonRoutingFilter。转发(Ri

  • 我们将我们的集群迁移到Cassandra 1.2(从1.1.7),并尝试在迁移后运行修复(我们按照建议定期运行它们)。 由于SSTable版本不同,修复失败,因此我们使用和并重试。 但是,修复失败了,但有这个例外: 我们还注意到,在死亡之前,< code>nodetool netstats显示了奇怪的统计数据(表传输为756845%...). 编辑 这似乎是压缩SSTables传输的问题,我将尝试

  • 我们目前使用Elasticsearch来存储由Filebeat发送的Spring Boot应用程序日志,并使用Kibana来可视化这一点。 我们的整个架构都是在一个docker-compose文件中进行docker化的。目前,当我们启动堆栈时,我们必须等待Elasticsearch启动,然后放置我们的摄取管道,然后重新启动Filebeat,只有这样我们的日志才会正确显示在Kibana中。 我对此很

  • 我有一个在大学里练习的代码。我已经安装了所有的软件包,但我不知道问题出在哪里。这将是一个小铲运机,只是测试一下。。。 错误消息说: 回溯(最近一次呼叫最后一次): 浏览器。通过xpath(“//*[@id=\”过滤器控制容器\“]/div[3]/div/div/ul/li[4]/a/span”)查找元素。单击文件“C:\Python27\lib\site packages\selenium\web