我編寫了一個Android套接字演示程序,它只是將用戶輸入發佈到服務器。 我通過wifi連接從android客戶端建立socket,一切順利,服務器端可以收到android客戶端發送的消息。問題是,然後關閉手機的WIFI,但套接字可以毫無例外地寫入。當wifi連接斷開時,Android套接字仍然可以正常寫入
Android客戶端的代碼:
public class MyActivity extends Activity {
private SocketHandlerThread thread;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
thread = new SocketHandlerThread("ScoketTest");
thread.start();
}
class SocketHandlerThread extends HandlerThread {
private Socket socket;
private Handler handler;
public SocketHandlerThread(String name) {
super(name);
}
public SocketHandlerThread(String name, int priority) {
super(name, priority);
}
@Override
public void run() {
try {
socket = new Socket("192.168.60.184", 1990);
} catch (IOException e) {
Log.e("SocketTest", e.getLocalizedMessage(), e);
}
super.run();
}
Handler getHandler() {
if (handler == null) {
handler = new Handler(getLooper());
}
return handler;
}
void send(final String text) {
Runnable runnable = new Runnable() {
public void run() {
Log.e("SocketTest", "Start send text: " + text);
try {
socket.getOutputStream().write((text + "\n").getBytes());
socket.getOutputStream().flush();
} catch (Exception e) {
Log.e("SocketTest", e.getLocalizedMessage(), e);
}
Log.e("SocketTest", "Text has been send:" + text);
}
};
getHandler().post(runnable);
}
@Override
protected void onLooperPrepared() {
runOnUiThread(new Runnable() {
@Override
public void run() {
findViewById(R.id.button).setEnabled(true);
}
});
}
}
public void send(View view) {
String text = ((EditText) findViewById(R.id.text)).getText().toString();
thread.send(text);
}
}
服務器的代碼:
public class SocketTestServer {
ServerSocket serverSocket;
SocketTestServer() throws IOException {
serverSocket = new ServerSocket(1990);
}
void start() throws IOException {
Socket clientSocket = serverSocket.accept();
clientSocket.getInputStream();
PrintWriter out = new PrintWriter(System.out, true);
BufferedReader in =
new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
}
}
public static void main(String[] args) throws IOException {
SocketTestServer server = new SocketTestServer();
server.start();
}
}
我嘗試幾個電話。在Galaxy Nexus(4.2.1)上拋出了一個預期的異常,但在某些MOTO或HTC手機上,套接字仍然可以毫無例外地寫入,這意味着我可能會丟失一些我認爲已成功接收的消息。 我怎麼能知道在任何類型的手機上的套接字連接被破壞?
任何建議將不勝感激。
p.s 我知道Connective Change Broadcast,但在接收廣播之前,客戶端可能會通過破損的套接字寫入一些消息。
儘管在應用協議上增加接收檢查可以解決郵件丟失問題,但我更願意保證TCP協議承諾的傳輸層的可靠性。