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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

1872閲覧

Android netcat

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2017/11/27 04:04

編集2017/11/27 11:58

netcatを使いandroidからMacに文字を送りたいです。

#MainActivity.java

java

1import android.app.Activity; 2import android.os.Bundle; 3import android.view.View; 4import android.widget.Button; 5 6import java.io.*; 7import java.net.*; 8 9 10 11public class MainActivity extends Activity { 12 Button button; 13 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 button = findViewById(R.id.button); 21 button.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 sendstring(); 25 } 26 }); 27 } 28 29 30 public void sendstring() { 31 try { 32 while(true){ 33 Socket socket = new Socket("アドレス", ポート番号); 34 OutputStream os = socket.getOutputStream(); 35 36 BufferedWriter bufwriter 37 = new BufferedWriter(new OutputStreamWriter( os ) ); 38 bufwriter.write("こんにちは"); 39 bufwriter.newLine(); 40 41 42 bufwriter.close(); 43 socket.close(); 44 } 45 } 46 47 catch( IOException e ) { 48 System.err.println("IO Error!"); 49 System.exit(-1); 50 } 51 52 } 53}

$ netcat -l -p ポート番号
をして、androidでアプリを起動させましたが入出力がうまくいってないみたいで、System.exit(-1);でアプリが終了してしまいました

どこが間違っているのか教えていただけないでしょうか?

#変更したコード

keicha_hrsさんから教えていただいた通り、UIスレッドではない、別のスレッドを作成して通信処理を実装しなければなならないのでAsyncTaskを使うとうまくいきました。

java

1package com.example.ueday.netcat; 2 3import android.app.Activity; 4import android.os.AsyncTask; 5import android.support.v7.app.AppCompatActivity; 6import android.os.Bundle; 7import android.view.Menu; 8import android.view.View; 9import android.widget.Button; 10import android.widget.TextView; 11import android.widget.Toast; 12 13import java.io.BufferedReader; 14import java.io.BufferedWriter; 15import java.io.IOException; 16import java.io.InputStreamReader; 17import java.io.OutputStream; 18import java.io.OutputStreamWriter; 19import java.net.Socket; 20import java.net.UnknownHostException; 21 22public class MainActivity extends Activity { 23 24 private TextView mTextView; 25 private String mHost = "google.com"; 26 private int mPort = 80; 27 private String mPath = ""; 28 private String mUserAgent = "Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; SC-06D Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"; 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 mTextView = (TextView)findViewById(R.id.TextView01); 35 36 Button btn = (Button) findViewById(R.id.Button01); 37 btn.setOnClickListener(new View.OnClickListener() { 38 39 @Override 40 public void onClick(View v) { 41 connect(); 42 } 43 }); 44 45 46 } 47 48 public void connect() { 49 50 new AsyncTask<Void, Void, String>() { 51 52 53 @Override 54 protected String doInBackground(Void... voids) { 55 try { 56 Socket socket = new Socket("10.0.33.13",4000); 57 OutputStream os = socket.getOutputStream(); 58 59 BufferedWriter bufwriter 60 = new BufferedWriter(new OutputStreamWriter( os ) ); 61 bufwriter.write("こんにちは"); 62 bufwriter.newLine(); 63 64 bufwriter.close(); 65 socket.close(); 66 67 } catch (IOException e) { 68 e.printStackTrace(); 69 } 70 return null; 71 } 72 }.execute(); 73 74 } 75 76 77 78} 79

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

netcatコマンドを使うのなら、NetCat.javaをコーディングした意味が全くないのでは?と思いつつ、Androidアプリ側についてだけ回答します。

ネットワークに通信をするプログラムを作るときは、AndroidManifest.xmlに

XML

1 <uses-permission android:name="android.permission.INTERNET" />

という行を追加して、ネットワークへのアクセス許可を得なければなりません。これが落ちる第一の理由です。

それを追加しても、なおこのアプリは落ちます。UIスレッド(TextViewなどのコンポーネントを操作できるスレッドのこと)上でTCP通信を行おうとすると、NetworkOnMainThreadExceptionというエラーが発生します。下記を実行した時点で強制終了してしまいます。

Java

1 Socket socket = new Socket("アドレス", ポート番号);

ですから、UIスレッドではない、別のスレッドを作成して通信処理を実装しなければなりません。別スレッド作成にはThreadかAsyncTaskを使うのがいいでしょう。

それから、通信処理部分をwhileで囲っていますが、これは無限に繰り返したい意図があるのでしょうか?ボタンを押す度に「こんにちは」を1回送信するだけのプログラムのつもりなら、この実装はおかしいですね。


(11/27 20:20 回答修正)
パーミッションを追加した状態で検証したため、結果として回答内容が間違っていた(exitに到達しないと指摘していたが到達していた)ので、回答を改めました。ただ、改善しなければならない要点自体に違いはありません。

投稿2017/11/27 09:02

編集2017/11/27 11:22
keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/27 11:22

AsyncTaskを使ったらうまくいきました。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問