2014-10-04 126 views
0

我仍然是新的套接字,並且在創建Android客戶端和c服務器時遇到了一些問題。C服務器沒有收到Java/Android客戶端消息

c服務器運行良好,並且android客戶端也很好地連接到c服務器。 但是,當與服務器通信時會出現問題。當我嘗試發送簡單的消息時,服務器似乎根本沒有收到它。

因此,這裏的服務器等待消息的代碼:

void readMsg(int client){ 
    char buffer[1024]; 
    int n = 0; 

    memset(buffer, 0, sizeof(buffer)); 

    printf("waiting for message..\n"); 
    while((n=recv(client, buffer, sizeof buffer - 1, 0)) > 0){ 
     printf("recv=%s\n", buffer); 
    } 

    printf("n=%d\n", n); 
} 

而且什麼都沒有顯示。它在waiting for message..上被阻止。

以及有關Java代碼來發送消息,那就是:

OutputStreamWriter osw; 
PrintWriter pw; 
try { 
    osw = new OutputStreamWriter(server.getOutputStream(), "UTF-8"); 
    pw = new PrintWriter(osw, true); 
    pw.print(msg); 
    pw.flush(); 

}catch(IOException ioe) { 
    ioe.printStackTrace(); 
} 

[編輯]

只是爲了提供更多的信息,功能readMsg()被稱爲剛剛啓動服務器後,一旦客戶端已連接。

欲瞭解更多信息,這裏是我連接到服務器的方式:

try{ 
    //I am sure that the host and port are correct 
    Socket server = new Socket(host, port); 

}catch(IOException ioe){ 
    ioe.printStackTrace(); 
} 

好了,所以我發現出了什麼毛病,我事實上是兩次連接到服務器。 因此,它無法通過正確的套接字發送消息。

對不起,我的一切,感謝您的所有幫助

[/編輯]

我已經通過查看本網站上幾個其他職位嘗試了幾種解決方案。

預先感謝您所有幫助

+0

OutputStreamWriter從客戶端發來的消息?你如何在服務器上調用readMsg()函數? – 4pie0 2014-10-04 16:01:14

+0

是的,該消息是從客戶端,Android應用程序發送的。 – BigFoot 2014-10-04 16:08:50

+0

你可以'telnet'到C服務器並讓它打印你在telnet提示符下鍵入的內容嗎? 'telnet servername 1234'其中servername和1234是主機,你在C上運行的服務器... – rolfl 2014-10-04 16:10:34

回答

1

使用的println代替print,還包內BufferedWriter

pw = new PrintWriter(new BufferedWriter(osw), true); 
pw.println(msg); 
+0

當套接字關閉時recv應該完成,儘管...哦,廢話,我要求關閉輸出流,而不是整個套接字。 – rolfl 2014-10-04 16:58:38

+0

@ashoke對不起,但它沒有改變任何東西 – BigFoot 2014-10-04 17:04:34

+0

你在'onCreate'裏面創建'server'套接字嗎?如果是這樣的話,可以考慮在一個單獨的線程中進行。 – ashoke 2014-10-04 17:16:23

相關問題