0

デバイスの GPS 座標をサーバーに送信する基本的なアプリケーションを作成しようとしています。私はソケット プログラミングの完全な初心者です (まあ、今年の大学で最低限の基礎を学びました)。

踏み石として、私はサーバーとアンドロイドクライアントを作成するオンラインチュートリアルに従っています。これは、ユーザーからの入力をサーバーに送信し、サーバーがそれをコンソールに出力するように設計されています。サーバーとクライアントの基本的な設定方法、つまりポートを開く方法にかなり慣れてきました。これに関する問題は、送信をヒットするとアプリがクラッシュし、エミュレーターでテストすると明らかに問題があることです。しかし、私はそれを見ることができません。

デバイスでテストして送信を押すと、コンソールに何も出力されません。以下にクライアント コードとサーバー コードの両方を添付しました。以下のコードの IP はエミュレータ用です。これをデバイスの IP に変更してテストします。

*サーバー*

public class Additional_Server {
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static InputStreamReader inputStreamReader;
private static BufferedReader bufferedReader;
private static String message;
public static void main(String[] args) {
    try {
        serverSocket = new ServerSocket(2001); // Server socket
    } catch (IOException e) {
        System.out.println("Could not listen on port: 2001");
    }
    System.out.println("Server started. Listening to the port 2001");
    while (true) {
        try {
            clientSocket = serverSocket.accept(); // accept the client connection
            inputStreamReader = new InputStreamReader(
                    clientSocket.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader); // get the client message
            message = bufferedReader.readLine();
            System.out.println(message);
            inputStreamReader.close();
            clientSocket.close();
        } catch (IOException ex) {
            System.out.println("Problem in message reading");
        }
    }
}

}

*クライアント*

import android.os.Bundle;
import android.app.Activity;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class TCPclient extends Activity {
private Socket client;
private PrintWriter printwriter;
private EditText textField;
private Button button;
private String messsage;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tcpclient);
        textField = (EditText) findViewById(R.id.Msg); // reference to the text field
        button = (Button) findViewById(R.id.bSend); // reference to the send button
        // Button press event listener
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                messsage = textField.getText().toString(); // get the text message on    the text field
                textField.setText(""); // Reset the text field to blank
                try {
                    client = new Socket("127.0.0.1", 2001); // connect to server
                    printwriter = new PrintWriter(client.getOutputStream(),
                            true);
                    printwriter.write(messsage); // write the message to output stream
                    printwriter.flush();
                    printwriter.close();
                    client.close(); // closing the connection
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

私が見ているものは正しいように見えるので、ポインタ、アドバイス、またはヘルプは大歓迎ですが、明らかに何かが間違っています。よろしくお願いします!!!

ゲイリー

上記のコードを編集して、提案どおりに非同期タスクに入れました。エミュレーターはクラッシュしていませんが、まだコンソールに出力できません..誰か助けてもらえますか? 私はここで試しています.私はAndroidにあまり慣れていません.これは学ぶための最良の方法です....

public class TCPclient extends Activity {

private Socket client;
private PrintWriter printwriter;
private EditText textField;
private Button button;
private String messsage;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tcpclient);

    textField = (EditText) findViewById(R.id.Msg);  // reference to the text field
    button = (Button) findViewById(R.id.bSend);     // reference to the send button
    messsage = textField.getText().toString();      // get the text message on the text field

    // Button press event listener
    button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            textField.setText(""); // Reset the text field to blank
            new commAsyncTask().execute();
        }

        class commAsyncTask extends AsyncTask<Void, Void, String> {

            @Override
            protected String doInBackground(Void... params) {
                // TODO Auto-generated method stub
                try {
                    client = new Socket("192.168.1.2", 2001); // connect to
                                                                // server
                    printwriter = new PrintWriter(client.getOutputStream());



                    printwriter.println(messsage); 
                    printwriter.flush();
                    printwriter.close();


                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
            }
        }

    });
}

}

私よりずっと賢い人がたくさんいるので、あなたの助けに感謝します。

4

1 に答える 1

0

tl dr - スレッド

基本的に Android では、UI はスレッドとコードで実行されます。そのため、ソケット コードが UI 部分の実行を停止しているため、Android OS はアプリが応答していないと (または同様のことを) 認識し、クラッシュします。

編集:修正するには、スレッドまたは非同期タスクなどを介して靴下を別のスレッドに入れます

于 2013-01-20T17:12:16.563 に答える