1. 程式人生 > >C#做伺服器,Android做客戶端,完成Socket通訊

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;

然後實現:
		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());
				}
			}
		});
然後在連線Button的監聽器中啟動執行緒:
		//連線按鈕的監聽器
		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通訊


4.原始碼下載(包括編譯好的exe與apk)