質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

android とPCとの通信でSocket s = new Socket()で処理が止まってしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,174

score 5

はじめに

android stadioとeclipseを用いてセンサ情報をPCへ送る処理を行っています。
一度,それらの処理に成功していましたが,プログラムを変更した際に動かなくなってしまいました。

私としまして,初歩的なミスだと思っておりますが中々解決できないのでよろしくお願いします。

問題点

mainスレッドでセンサデータを取得しスレッドを用いてTCP通信を行います。
ここでスレッドスタートまで実行されたことは確認できましたが、スレッド内の
Socket socket = new Socket(Ip,Port);
でスレッドが止まってしまっているのを確認しました.

受信側もsocketをacceptの状態で止まっています.

プログラム以外でも要因がある可能性がありますので、ソケット通信で気をつける点等教えてください

Android Stadio

package com.e.myapplication4;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.util.Log;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import java.util.Locale;

//
//世界座標系の加速度と方位を取得するhttps://qiita.com/ryskiwt/items/f6d98c0a82ba7e31c9b3
public class MainActivity extends Activity
        implements SensorEventListener, View.OnClickListener{


    public String  sendingStr[] = new String[10];
//
    //-- --//
    private SensorManager sensorManager;
    private Sensor accel;
    private Sensor gyro;
    private Sensor magn;
    private TextView textView;

    private LineChart mChart;
    public String[] labels = new String[]{
            "linear_accelerationX",
            "linear_accelerationY",
            "linear_accelerationZ"};
    private int[] colors = new int[]{
            Color.BLUE,
            Color.GRAY,
            Color.MAGENTA};

    private boolean lineardata = true;
    float gravity[] = new float[3];
    float gyroscope[] = new float[3];
    float magnetic[] = new float[3];
    public float linear_acceleration[] = new float[3];


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button_start).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


            }
        });
        // 縦画面
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        // Get an instance of the SensorManager
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        // Get an instance of the TextView
        textView = findViewById(R.id.text_view);

    }

    @Override
    protected void onResume() {
        super.onResume();
        // Listenerの登録
        accel = sensorManager.getDefaultSensor(
                Sensor.TYPE_ACCELEROMETER);
        gyro = sensorManager.getDefaultSensor(
                Sensor.TYPE_GYROSCOPE);
        magn = sensorManager.getDefaultSensor(
                Sensor.TYPE_MAGNETIC_FIELD);


        sensorManager.registerListener(this, accel,
                SensorManager.SENSOR_DELAY_NORMAL);//周波数50Hz
        sensorManager.registerListener(this, gyro,
                SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, magn,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    // 解除するコードも入れる!
    @Override
    protected void onPause() {
        super.onPause();
        // Listenerを解除
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        try {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                linear_acceleration[0] = event.values[0];
                linear_acceleration[1] = event.values[1];
                linear_acceleration[2] = event.values[2];


                String accelero;

                if (!lineardata) {
                    accelero = String.format(Locale.US,
                            "X: %.3f\nY: %.3f\nZ: %.3f",
                            event.values[0], event.values[1], event.values[2]);
                } else {
                    accelero = String.format(Locale.US,
                            "X: %.3f\nY: %.3f\nZ: %.3f",
                            gravity[0], gravity[1], gravity[2]);
                }

                textView.setText(accelero);

                        // data update
                        if (!lineardata) {
                            data.addEntry(new Entry(set3.getEntryCount(), event.values[i]), i);
                        } else {
                            data.addEntry(new Entry(set3.getEntryCount(), linear_acceleration[i]), i);
                        }

                        data.notifyDataChanged();
                    }

                }
            }
            else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {

                gyroscope[0] = event.values[0];
                gyroscope[1] = event.values[1];
                gyroscope[2] = event.values[2];
            }
            else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

                magnetic[0] = event.values[0];
                magnetic[1] = event.values[1];
                magnetic[2] = event.values[2];
            }
            DateFormat format = new SimpleDateFormat("hh:mm:ss.SSS");
            String date = format.format(new Date());
            String accelStringX = Float.toString(linear_acceleration[0]);
            String accelStringY = Float.toString(linear_acceleration[1]);
            String accelStringZ = Float.toString(linear_acceleration[2]);
            String gyroStringX = Float.toString(gyroscope[0]);
            String gyroStringY = Float.toString(gyroscope[1]);
            String gyroStringZ = Float.toString(gyroscope[2]);
            String magneticStringX = Float.toString(magnetic[0]);
            String magneticStringY = Float.toString(magnetic[1]);
            String magneticStringZ = Float.toString(magnetic[2]);

            sendingStr[0] =date;
            sendingStr[1] = accelStringX+","+accelStringY+","+accelStringZ;
            sendingStr[2] = gyroStringX+""+gyroStringY+","+gyroStringZ;
            sendingStr[3] = magneticStringX+""+magneticStringY+","+magneticStringZ;

            TCPsocket cl = new TCPsocket(sendingStr);
            cl.start();
            Log.v("debug","start");

        }catch(Exception e){
            e.printStackTrace();
            TCPsocket cl = new TCPsocket(sendingStr);
            cl.start();
        }
    }


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}

public class TCPsocket extends Thread {
    private String Ip = "---";    //アクセス先IP
    private int Port = 1111;            //アクセス先ポート
    public String date;
    public String acceldata, gyrodata, magnetdata;



    public TCPsocket(String str[]) {
        this.date = str[0];
        this.acceldata = str[1];
        this.gyrodata = str[2];
        this.magnetdata = str[3];


    }


    @Override
    public void run() {
        try {
//通信用ソケット作成
            Log.v("debug","run");

            Socket socket = new Socket(Ip, Port);
            Log.v("debug","check");
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));

            //Log.v("debug","server");
//テキストを送る

            bw.write(this.date+","+this.acceldata + "," + this.gyrodata + "," + this.magnetdata+"\n");
//            bw.write(this.sensordata[0]);z

//データを確定させて通信処理を起こさせる
            bw.flush();
            Log.v("debug","sended");

//後処理
            in.close();
            out.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


eclipse

import java.util.*;
import java.io.*;
import java.net.*;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.FileWriter;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.PrintWriter;


public class Server{
    public static final int PORT =1111;
    static final String INPUT_DIR = "---";
    public String stopStr = null;
    public static void main(String args[]) {
        Server sm =new Server();

        try {
            ServerSocket ss = new ServerSocket(PORT);
            BufferedReader br;
//            PrintWriter pw;
            //ファイルを開く
            FileWriter f = new FileWriter(INPUT_DIR,false);
            PrintWriter p = new PrintWriter(new BufferedWriter(f));
//            p.println("時間,加速度X,加速度Y,加速度Z,ジャイロX,ジャイロY,ジャイロZ,磁気X,磁気Y,磁気Z");
//            System.out.println("待機します");

            Socket sc;

            while(true){
                try {                    
                    ss.setSoTimeout(15000);
                    System.out.println("待機します");
                    sc = ss.accept();
                    System.out.println("接続しました");
                    br = new BufferedReader(
                            new InputStreamReader(
                                    sc.getInputStream()
                            )
                    );
                    String str = br.readLine();
                    System.out.println(str);
                    p.println(str);
                    sc.close();
                }
                catch(Exception e) {
//                    e.printStackTrace();
                    System.out.println("お疲れ様でした");
                    p.close();
                }    
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

状況

androidのlogcatではrunが表示し、checkは出ない状況
eclipseでは待機しますで止まっています。

アドバイスよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/10/03 08:03

    「プログラムを変更した際に動かなく」なったのでしたら, 変更を戻してみては如何でしょうか.

    キャンセル

  • dodox86

    2019/10/03 08:37

    以前に動作していたときと、ホスト(IPアドレス)/ポート番号を変えていませんか?(サーバー、クライアント共に)
    また、android側、run()内のtry ~ catch で例外をcatchしていないか確認してください。>e.printStackTrace()のところ

    キャンセル

  • dodox86

    2019/10/03 08:42

    あと、直接関係ないですが質問につけているタグの「Socket.IO」は実はサーバーサイドJavaScriptのNode.js のライブラリを指します。「TCP」「ソケット」あたりが妥当でしょうか。

    キャンセル

回答 1

check解決した方法

0

PCのキャッシュをクリアしたら解決しました.
コード自体は間違っていなかったようです.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る