2017-06-12 253 views
0

我在實現與Android應用程序通信的服務器端應用程序。 Android應用程序 在最初與C++服務器通信之前已經實現。現在我想用java代碼替換C++服務器。 Android應用程序與服務器進行通信,以通過卡讀卡器中的卡進行身份驗證。IOException:斷開的管道

驗證協議包含應用程序和服務器之間的通信步驟,以便成功完成。該應用和服務器之間

消息具有以下形式:

<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 [<data>] 
  1. 首先,應用發送類型1的請求建立在讀卡器連接到SIM卡。
  2. 然後,服務器上的clientSocket發送一個類型爲0的響應,該響應頭已收到最後一條消息。
  3. 之後,服務器接收到類型2的新請求,將SIM卡的ATR(應答到休息)發送到應用程序。
  4. 服務器的clientSocket嚮應用發送類型2的消息。 。 。 。 。 。 。 。 。 。 。 。 。 。

最後我想關閉serverSocket和服務器端的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應用中得到以下錯誤:

IOException異常:破管

回答

1

你正在一座小山上劃出一道山。下面是簡單的方法來做到這一點:

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}; 
+0

但在這種情況下,clientSocket正在關閉,如果InputStream中沒有數據,我不能再與應用程序通信?或者我缺少一些東西,並且'bufferedInputStream'始終有來自 應用程序的數據,並且如果應用程序沒有發送數據,則readBytes值爲-1?目前與您的代碼我收到相同的錯誤。我只發送了8個字節。我沒有在這裏使用flush()嗎? – tree

+0

編號'Socket.getInputStream()'不需要刷新,如果對等體已經關閉了連接,客戶機套接字將被關閉。這就是'read()'返回-1的意思。如果對方關閉了連接,則不能寫入,因爲它不再存在。 – EJP

相關問題