0
我在實現與Android應用程序通信的服務器端應用程序。 Android應用程序 在最初與C++服務器通信之前已經實現。現在我想用java代碼替換C++服務器。 Android應用程序與服務器進行通信,以通過卡讀卡器中的卡進行身份驗證。IOException:斷開的管道
驗證協議包含應用程序和服務器之間的通信步驟,以便成功完成。該應用和服務器之間
消息具有以下形式:
<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 [<data>]
- 首先,應用發送類型1的請求建立在讀卡器連接到SIM卡。
- 然後,服務器上的clientSocket發送一個類型爲0的響應,該響應頭已收到最後一條消息。
- 之後,服務器接收到類型2的新請求,將SIM卡的ATR(應答到休息)發送到應用程序。
- 服務器的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異常:破管
但在這種情況下,clientSocket正在關閉,如果InputStream中沒有數據,我不能再與應用程序通信?或者我缺少一些東西,並且'bufferedInputStream'始終有來自 應用程序的數據,並且如果應用程序沒有發送數據,則readBytes值爲-1?目前與您的代碼我收到相同的錯誤。我只發送了8個字節。我沒有在這裏使用flush()嗎? – tree
編號'Socket.getInputStream()'不需要刷新,如果對等體已經關閉了連接,客戶機套接字將被關閉。這就是'read()'返回-1的意思。如果對方關閉了連接,則不能寫入,因爲它不再存在。 – EJP