? ? 前后應(yīng)該花了近3天半時間,就為了能通信成功,因?yàn)轫椖啃枨螅枰赼ndroid 端同時開啟socketServer服務(wù)和socket通信,socketServer用來接收消息,socket用來發(fā)送消息這樣的模式,更為坑的是,我是用android端與C#的服務(wù)器端通信。
一開始就是用常規(guī)寫法做android端的socket客戶端:
Socket socket=new Socket();
socket.connect("ip地址","端口號");
OutputStream os= socket.getOutputStream();
String msg="abc";
os.write(msg.getBytes("utf8"));
os.flush();
C#服務(wù)器端就是接收不到我傳過去的消息,我用java寫的后端就能成功接受我常規(guī)寫法傳過去的數(shù)據(jù)
我后來改為另一種寫法:
PrintWriter pw =new PrintWriter(new OutputStreamWriter(os,"utf-8"));
pw.println(msg);
pw.flush;
我在參考別人遇到的同類問題時,也看到,pw.print()方法,c#同樣無法接收到,這個我倒沒有去測試過。有待考證。。。
另外,在android需要作為socket的server端和client端的話呢,一定是要先開啟服務(wù)端,再啟用客戶端(都是指的android 端)。通過先后啟用兩個服務(wù)service來達(dá)到兩個線程的效果,不要單純的啟動兩個線程,因?yàn)閱⒂脙蓚€線程的執(zhí)行順序,一定不會達(dá)到你的預(yù)期結(jié)果的。只有通過startService(),因?yàn)閟ervice畢竟還是運(yùn)行在主線程的。
因?yàn)閟erverSocket.accept()方法是進(jìn)程阻塞的,因此一定是要放在線程中的,不然會阻塞當(dāng)前主線程,切記切記!
這就是我三天總結(jié)出來的項目經(jīng)驗(yàn)。謝謝~~