C#做伺服器,Android做客戶端,完成Socket通訊
先說幾句廢話,我沒學過java語法,所以寫起來很痛啊,只能多百度,多看別人的程式碼~
1.按照慣例,先寫一下遇到的問題:
1.java.net.SocketException: socket failed EACCES (Permission denied)
初始化Socket遇到這個異常,是因為沒有給網路許可權,在AndroidManifest.xml中新增一句:
<uses-permission android:name="android.permission.INTERNET" />
注意新增的位置,要寫在<application之前
2.Unhandled exception type IOException
經常會出現這個錯誤,是因為你沒有處理這個操作可能產生的異常,在C#中這個並不會編譯不過去,但是這裡還是老老實實加上try catch吧,只要滑鼠點一下下面的Surround with try/catch就會自動給你新增,很方便。
3.android.os.NetworkOnMainThreadException
android4.0不允許把網路操作這種耗時的東東寫在主執行緒裡面,執行的時候程式會直接停止執行,不過本來這些耗時的操作就應該在後臺執行緒操作,所以為了解決這個問題要先簡單學一點關於多執行緒的。等下會說~
2.Android多執行緒操作
1.Socket的初始化,即連線到伺服器,要在非主執行緒中寫,那就先實現這個吧:
先宣告這個執行緒:
private Thread connectThread = null;
然後實現:
然後在連線Button的監聽器中啟動執行緒:connectThread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { //初始化Scoket,連線到伺服器 socket = new Socket(ServerIP, ServerPort); isConnect = true; //啟動接收執行緒 isReceive = true; receiveThread = new ReceiveThread(socket); receiveThread.start(); System.out.println("----connected success----"); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("UnknownHostException-->" + e.toString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("IOException" + e.toString()); } } });
//連線按鈕的監聽器
btnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (!isConnect){
connectThread.start();
}
}
});
這樣就可以了,連線到伺服器了
2.向伺服器傳送訊息
按照上面連線的方法去實現傳送訊息,第一次發 訊息,沒問題,成功接收了,第二次,出現問題了,說是傳送訊息的執行緒已經啟動了。這邊我不理解,執行緒不是執行一次就會自動銷燬麼。不懂為什麼,所以傳送這邊用了Runnable介面,然後new Thread(runnable).start()
//傳送訊息的介面
Runnable sendThread = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
byte[] sendBuffer = null;
try {
sendBuffer = strMessage.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
outStream = socket.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
outStream.write(sendBuffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
//傳送按鈕的監聽器
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
strMessage = textSend.getText().toString();
new Thread(sendThread).start();
}
});
3.C#做的伺服器
直接給原始碼了,改天再寫一篇關於C#的Socket通訊