標籤:android io os 使用 ar java 資料 sp art
====================問題描述====================
c#服務端:
//建立監聽連接埠..... private void StartListening() { //建立IPEndPoint IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.16.41.120"), 8897); //建立Socket執行個體 server_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //綁定Socket與IPEndPoint server_Socket.Bind(ipep); //設定Socket收聽模式 server_Socket.Listen(10); while (true) { try { System.Net.Sockets.Socket s = server_Socket.Accept(); Thread newsocekt= new Thread(new ParameterizedThreadStart(ServiceClient)); newsocekt.Start(s); } catch (Exception e) { Console.WriteLine(e.ToString()); } } } //為每一個串連到伺服器的通訊端開闢一個新的線程 private void ServiceClient(object soc) { System.Net.Sockets.Socket clientS = soc as Socket; byte[] bytearry = new byte[1024]; int buffer_lenght = clientS.Available; clientS.Receive(bytearry, 0, buffer_lenght, SocketFlags.None);//擷取安卓發來的訊息,這裡可以收到資訊 string res = Encoding.GetEncoding("utf-8").GetString(bytearry); //****** *****/ // res 是安卓發來的訊息,通過info判斷做什麼事情,這裡省略了 byte[] arry = Encoding.GetEncoding("utf-8").GetBytes("我操你大爺,給不給我發資訊回去/0"); clientS.Send(arry, arry.Length, SocketFlags.None);//往安卓回傳訊息 //我感覺這樣寫不太對,這樣發到C#的用戶端可以收到的,但是安卓那收不到 }
服務端
public class SocketClient {static Socket client;public SocketClient(String site, int port) {try {client = new Socket(site, port);} catch (Exception e) {Log.i("t460470591", "error");e.printStackTrace();} }public String sendMsg(String msg) {try {PrintWriter out;out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);out.println(msg);//發送資料到服務端 Thread.sleep(1000);//沒做while迴圈接收伺服器的資料,我就直接睡眠一下,只接收一次資料 InputStream inputStream= client.getInputStream(); //擷取通訊端的輸入資料流ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i=-1; while((i=inputStream.read())!=-1){ //我這裡DEbug發現,每次都有資料的,我就跟蹤while,一個F6,F6按,//按著按著就在這裡卡死了...不是我機子,我也不懂怎麼弄,反正資料就回不來,程式不是錯處,//而且直接就不能調試了,估計是還在等在資料 baos.write(i); } Log.i("t460470591", baos.toString());//這裡擷取接收的值,但是程式阻塞在這裡了 return baos.toString();} catch (Exception e) {e.printStackTrace();Log.i("t460470591",e.getMessage()+ "a");}return "";}
通訊端我是第一次寫,好多都不懂的,而且還是誇平台的,尼瑪,求救啊,有列子看看也好
====================解決方案1====================
Java端兩個問題
1. static Socket client; 在執行個體方法中使用並且沒有做同步, 去掉static,否則多線程發送就全亂了
2.服務端因為你已經用了獨立線程處理,所以寫個讀用阻塞執行不會有什麼影響,用戶端發送時直接在主線程中同步發送再讀取就不太可取了,發送到接收,你用的是Thread.sleep(1000); 這個時間你是如何確定的?
C#中通常的做法是非同步發送和讀取BeginSend(datas, OnReadReplayCallback, stateObj)
void OnReadReplayCallback(IAsyncResult asyncResult)
{
while(讀到資料) 寫入緩衝
if(緩衝不為空白) 觸發接受到資料的事件或委託
}
這樣程式就不用阻塞了,並且也會按照順序正確執行
上面只是供參考的思路
【急】c#伺服器用通訊端與android服務端互連訓,要雙向的,我自己寫了一個,不成功,求例子,求指導,急啊