2016-03-30 17 views
0

アンドロイドクライアントからCサーバに文字列を送信できます。 しかし、私はサーバーからアンドロイドクライアントに応答を返すことができません。 アンドロイドクライアントがデータを取得していません。私は、応答をcサーバから受け取った "トースト"したい。アンドロイドクライアントはCサーバソケットからの応答を得ていません

Serverコード(C):

#include <stdio.h> 
#include <stdlib.h> 

#include <netdb.h> 
#include <netinet/in.h> 

#include <string.h> 

int main(int argc, char *argv[]) { 
int sockfd, newsockfd, portno, clilen; 
char buffer[256]; 
char g[255]; 
char *message; 
struct sockaddr_in serv_addr, cli_addr; 
int n; 
int p; 

/* First call to socket() function */ 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 

if (sockfd < 0) { 
    perror("ERROR opening socket"); 
    exit(1); 
} 

/* Initialize socket structure */ 
bzero((char *) &serv_addr, sizeof(serv_addr)); 
portno = 5011; 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = inet_addr("192.168.1.125"); 
//serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(portno); 

/* Now bind the host address using bind() call.*/ 
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
    perror("ERROR on binding"); 
    exit(1); 
} 

/* Now start listening for the clients, here process will 
    * go in sleep mode and will wait for the incoming connection 
*/ 

listen(sockfd,5); 
clilen = sizeof(cli_addr); 

/* Accept actual connection from the client */ 
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); 

if (newsockfd < 0) { 
    perror("ERROR on accept"); 
    exit(1); 
} 

/* If connection is established then start communicating */ 
bzero(buffer,256); 
n = read(newsockfd,buffer,255); 

if (n < 0) { 
    perror("ERROR reading from socket"); 
    exit(1); 
} 

printf("Here is the message: %s\n",buffer); 

/* Write a response to the client */ 

//int man = 12345; 
message ="hello\n"; 

n = write(newsockfd, message,strlen(message)); 


return 0; 
} 

****アンドロイドクライアント:****

import android.app.Activity; 
import android.graphics.Color; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.text.format.Formatter; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 


public class ScreenTwo extends Activity { 
    EditText et; 
String txt,ssid,key; 
WifiManager wifiManager; 
private Socket socket; 

private Socket clientSocket; 
private BufferedReader input; 


static final int SERVERPORT = 5047; 
private static final String SERVER_IP = "192.168.1.125"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen2); 
    new Thread(new ClientThread()).start(); 


} 


public void onClick(View v) { 

    try { 
     EdritText et = (EditText) findViewById(R.id.tb1); 
     Sting str = et.getText().toString(); 
     PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(socket.getOutputStream())), 
       true); 
     out.println(str + "\n"); 
     out.flush(); 


     BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String read = input.readLine(); 
     Toast.makeText(this, read, Toast.LENGTH_LONG).show(); 

     //ready to receive data from server 
     //BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     //System.out.println(in.readLine()); 
     //Toast.makeText(this, in.readLine(), Toast.LENGTH_LONG).show(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void onEnterBtn(View v) 
{ 
    //Toast.makeText(this, "Clicked on Button", Toast.LENGTH_LONG).show(); 
    et=(EditText)findViewById(R.id.tb1); 
    txt=et.getText().toString(); 
    Toast.makeText(this, txt, Toast.LENGTH_LONG).show(); 

    Button disp = (Button)findViewById(R.id.dispbtn); 
    disp.setBackgroundColor(Color.parseColor(txt)); 



} 

public void onbuttonwifi(View v) 
{ 
    //Toast.makeText(this, "Clicked on Button", Toast.LENGTH_LONG).show(); 
    WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE); 
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); 
    int ip = wifiInfo.getIpAddress(); 
    String ipAddress = Formatter.formatIpAddress(ip); 
    Toast.makeText(this, ipAddress, Toast.LENGTH_LONG).show(); 

} 

class ClientThread implements Runnable { 
    @Override 
    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
      socket = new Socket(serverAddr, SERVERPORT); 

     } catch (UnknownHostException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

}予め

おかげ:)

+0

あなたの質問に誤字があり、どのようなものが動作していないのかわかりません。あなたがアンドロイドのメインスレッドでネットワーキングしているので、これはいずれの方向にも動作しません。 –

+0

アンドロイドのJavaクライアントとC++サーバーを持っているので、当然これをC(facepalm)でタグ付けします。皮肉なことに、それはCコードのように見えるので、C++がどこに来るのかは謎です。 Btw、あなたの 'main()'のスタンドアローン 'gul [200];の目的は何ですか? – WhozCraig

+0

ya ..私の間違い...そのサーバーはC++ではなく、コードを編集しました...それはgul [200]を持っていません。このコードは、cサーバに接続して文字列を送信することができます。しかし、アンドロイドクライアントは、この場合、変数 "g"によって与えられる応答を受け取っていません。 –

答えて

0
String read = input.readLine(); 

クライアントは行の読み取りを試みます。しかし、サーバが送信する前に、文字列変数g"\n"を追加

n = write(newsockfd, g,p); 

で行を送信していません。そして、pを決定する前に。

+0

試してみました...うまくいきませんでした:( –

+2

あなたのコードを表示してください。 – greenapps

0

まず、このコードは非常に古いアンドロイドデバイスでのみ動作します。最新のデバイスでは、メインスレッドでネットワーキングを行うことはできません。別のスレッドに移動する必要があります。これを行うには、Web上に十分なチュートリアルがあります。

プログラムを終了する前に、ソケットやファイルなどを閉じるのが一般的には良い方法です。私はあなたが書いたコードにキャッシングするのは難しいとは思っていませんが、それは常に危険であるため、プログラムを早期に意図的に終了しない限り、close(newsockfd)を実行するべきです。

あなたが見ている障害の原因として最も可能性が高いBufferedReader.readline()は、すべての行の末尾の行終端(\n)があると予想し、あなたが1送信されていません...メモリgets()から行が含まれていないということですユーザが「入力」を押すと、ターミネータが表示されます。

この仮定では、行終端文字を送信するために何かする必要があります。送信する前に文字列を変更するか、別途送信してください:

n = write(newsockfd, "\n", sizeof("\n") - 1); 

すべての書き込みと読み取りごとに応答を確認する必要があります。書き込みも同様に失敗することがあります。

if (n < 0) { 
    perror("ERROR writing from socket"); 
    exit(1); 
} 

// ... 

close(newsockfd); 

あなたはこのすべてを試みたし、そのそれでも動作しない場合は...両側の出力で

ルックは、彼らがすべてのエラーを印刷していないことを確認してください。これまでのところ、あなたの回答は、「働かない」というのはそのぶら下がりを意味するという仮定に基づいています。いずれかの面にエラーが表示されている場合は、何が起こっているかをより多くの光を当てるでしょう。

単にハングしているのであれば、Cで単純なテストクライアントを構築することをお勧めします。そうすれば、Cで動作するかどうかを示すことができます。したがって、Cコードまたはアンドロイドコードが機能していません。どの技術に問題があるかを理解することができれば、より多くの助けを得ることができます。