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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

解決済

UDP通信にてボタン押下で文字列を切り替えながら連続で出力する方法

roatt
roatt

総合スコア45

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0評価

0クリップ

409閲覧

投稿2021/12/17 08:58

前提・実現したいこと

Android Studioを使用して、AndroidからPCへ以下の条件に沿った出力値をUDP通信で連続して出力するシステムを作成したいです。
・Button1が1度押下された場合、「A」が出力され、この値は0.1秒間保持される
・Button2が1度押下された場合、「B」が出力され、この値は0.1秒間保持される
・Button3が1度押下された場合、「C」が出力され、この値は0.1秒間保持される
・Buttonが押下されていない場合、「1」が出力され続ける

現状のプログラムとして
・アプリケーションが起動したときに、「1」が出力
・Button1が1度押下された場合、「A」が出力
・Button2が1度押下された場合、「B」が出力
・Button3が1度押下された場合、「C」が出力
までUDP通信で出力値を送信することができましたが、連続で出力する方法や出力値を保持する方法が分からず困っております。

※出力値はUdpIpToolで見ています。

該当のソースコード

MainActivity

Java

public class MainActivity extends AppCompatActivity { private static int PORT = 34567; //ポート宣言 DatagramSocket soc; //ソケット PrintWriter printWriter; //ソケット送信用 String text; int a = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //サーバー用にソケットを作成し、ポートを設定する try { soc = new DatagramSocket(34567); soc.bind(new InetSocketAddress(PORT)); } catch (Exception e) { e.printStackTrace(); } //接続されたら"1"を出力 SendSocTask sendSocTask = new SendSocTask(10); sendSocTask.execute(); text ="1"; Button button1 = findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SendSocTask sendSocTask = new SendSocTask(1); sendSocTask.execute(); text ="A"; } }); Button button2 = findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SendSocTask sendSocTask = new SendSocTask(2); sendSocTask.execute(); text ="B"; } }); Button button3 = findViewById(R.id.button3); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SendSocTask sendSocTask = new SendSocTask(3); sendSocTask.execute(); text ="C"; } }); } class SendSocTask extends AsyncTask<InetSocketAddress, Void, Void> { private int sendValue; //コンストラクタ public SendSocTask(int value) { sendValue = value; } @Override protected Void doInBackground(InetSocketAddress... inetSocketAddresses) { try { byte[] ms = text.getBytes(); DatagramPacket packet = new DatagramPacket(ms, ms.length, new InetSocketAddress(InetAddress.getByName("PCのIPアドレス"),PORT)); soc.send(packet); } catch (Exception e) { } finally { try { //通信後、Socket接続を閉じ、関連付けられたすべてのリソース解放 if (a == 0) { printWriter.close(); } if (a==0) { } } catch (Exception e) { e.printStackTrace(); } } return null; } } }

activity_main

xml

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:text="Button" app:layout_constraintBaseline_toBaselineOf="@+id/button2" app:layout_constraintEnd_toStartOf="@+id/button2" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:layout_marginBottom="324dp" android:text="Button" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/button3" app:layout_constraintStart_toEndOf="@+id/button1" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="1dp" android:text="Button" app:layout_constraintBaseline_toBaselineOf="@+id/button2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/button2" /> </androidx.constraintlayout.widget.ConstraintLayout>

試したこと

soc.send(packet);やclass SendSocTask内のコードにwhile(true)を挟み込み、無理に無限ループで出力してみましたが、
タブレットの画面は真っ白になり(正常に表示される場合もありました)、UdpIpToolのログも当たり前ですが「1」だけ出力され、「切断」をクリックしても無限ループし続けていました。

補足情報(FW/ツールのバージョンなど)

上記にも記載しましたが、Android studioを使用し、javaで作成しています。
どうにか実現したい事ができないかインターネットで調べてみましたが、
まったく実現方法がわかりませんでした…
お手数をおかけしますが、プログラミングの力も未熟なため丁寧に説明もいただけると大変ありがたいです。
何か不明点あれば、ご質問いただけますと幸いです。
よろしくお願いします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

y_waiwai

2021/12/17 09:00

連続で出力するとは?どうなればいいんでしょう
dodox86

2021/12/17 09:23 編集

0.1秒間保持、と言うのが謎です。送信はワンショット、1回送ったら終わりです。
jimbe

2021/12/17 10:02

> 無限ループで出力してみましたが、タブレットの画面は真っ白 android はシングルタスクですから、単純に無限ループすれば表示も操作も一切動作しなくなるのは "当然" です。 > どうにか実現したい事ができないかインターネットで調べてみました どのような調査をされたのでしょうか。
roatt

2021/12/17 14:46

>連続で出力するとは?どうなればいいんでしょう >0.1秒間保持、と言うのが謎です。送信はワンショット、1回送ったら終わりです。 連続で送信されるといったほうが正しいかもしれません。 何もボタンを押さなければ ずっと「1 1 1 1 1 1……」と送信され、 Button1が押されれば0.1秒間「A A A A ……」と送信されるようなイメージです。 その後何もボタンが押されなければまた「1 1 1 1……」と送信されますし、Button2が押されれば0.1秒間「B B B B……」文字列が送信されるプログラムを作りたいです。
jimbe

2021/12/17 15:11

> android はシングルタスクですから、単純に無限ループすれば すいません、 AsyncTask の doInBackground 内であれば関係無いですね。 失礼しました。
roatt

2021/12/17 15:19 編集

>すいません、 AsyncTask の doInBackground 内であれば関係無いですね。 >失礼しました。 いえいえ、いろいろ教えていただき感謝しています。 >どのような調査をされたのでしょうか。 連続で送信される方法を探したのですが、文字列を1度送信する方法しか見つけられませんでした。 指定時間分処理を行うプログラムも探しました。 Timer関数を使うものは発見しましたがいまいち理解できずやりたいことと同じことができるのかわからずこちらに質問をさせていただいた次第です。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。