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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

816閲覧

androidでsocket通信

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/11/27 13:28

編集2017/11/28 13:18

#実現させたいこと
androidから獲得したジャイロセンサーの値をnetcatを使いマックに連続して表示させたい。
#該当のコード

java

1 2import android.app.Activity; 3import android.content.Context; 4import android.hardware.Sensor; 5import android.hardware.SensorEvent; 6import android.hardware.SensorEventListener; 7import android.hardware.SensorManager; 8import android.os.AsyncTask; 9import android.os.Bundle; 10import android.view.SurfaceHolder; 11import java.io.BufferedWriter; 12import java.io.IOException; 13import java.io.OutputStream; 14import java.io.OutputStreamWriter; 15import java.net.Socket; 16import java.util.List; 17 18 19public class MainActivity extends Activity 20 implements SensorEventListener, SurfaceHolder.Callback{ 21 22 SensorManager mSensorManager; 23 Sensor mAccSensor; 24 25 float mVX; 26 float mVY; 27 28 29 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 36 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 37 mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 38 39 40 /* Button btn = (Button) findViewById(R.id.Button01); 41 btn.setOnClickListener(new View.OnClickListener() { 42 @Override 43 public void onClick(View v) { 44 connect("koko"); 45 } 46 });*/ 47 48 } 49 50 @Override 51 protected void onStop() { 52 super.onStop(); 53 mSensorManager.unregisterListener(this); 54 } 55 56 @Override 57 protected void onResume() { 58 super.onResume(); 59 List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE); 60 if(sensors.size() > 0) { 61 Sensor s = sensors.get(0); 62 mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_UI); 63 } 64 } 65 66 public void connect(final String str) { 67 new AsyncTask<Void, Void, String>() { 68 69 70 @Override 71 protected String doInBackground(Void... voids) { 72 try { 73 74 Socket socket = new Socket("10.0.33.13",4000); 75 OutputStream os = socket.getOutputStream(); 76 77 BufferedWriter bufwriter 78 = new BufferedWriter(new OutputStreamWriter( os ) ); 79 bufwriter.write(str); 80 //bufwriter.newLine(); 81 bufwriter.flush(); 82 bufwriter.close(); 83 socket.close(); 84 85 86 87 } catch (IOException e) { 88 e.printStackTrace(); 89 } 90 return null; 91 } 92 }.execute(); 93 } 94 95 @Override 96 public void onSensorChanged(SensorEvent event) { 97 if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { 98 99 100 float y = event.values[1]; 101 float x = event.values[2]; 102 103 mVX = mVX + x; 104 mVY = mVY + y; 105 106 107 String str = "X:" + mVX +"\n" 108 + "Y:" + mVY +"\n"; 109 110 connect(str); 111 } 112 } 113 114 @Override 115 public void onAccuracyChanged(Sensor sensor, int accuracy) {//使わない 116 } 117 118 @Override 119 public void surfaceCreated(SurfaceHolder holder) { 120 registerSensor(); 121 } 122 123 public void registerSensor() { 124 mSensorManager.registerListener(this, mAccSensor, SensorManager.SENSOR_DELAY_GAME); 125 } 126 127 @Override 128 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 129 130 mVX = 0; 131 mVY = 0; 132 } 133 134 @Override 135 public void surfaceDestroyed(SurfaceHolder holder) { 136 mSensorManager.unregisterListener(this); 137 } 138} 139

onSensorChanged()でセンサーが獲得する値が変わるたびにconnect()は呼ばれるので連続に表示されると思いましたが一度だけ表示されるだけでうまくいきませんでした。

connect()の bufwriter.flush();が終了させているのでしょうか?

そもそもこの通信方法で連続して文字列を返すのはできませんか?

ご存知の方がいましたらご教授ください

#Server.java

java

1 2 3 4import java.io.BufferedReader; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.PrintWriter; 8 import java.net.InetSocketAddress; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 12public class Server { 13 public static void main(String[] args) { 14 // サーバーソケットを生成&待機 15 try { 16 ServerSocket server = new ServerSocket(); 17 server.bind(new InetSocketAddress("アドレス", ポート番号)); 18 try { 19 Socket socket = server.accept(); 20 BufferedReader reader = new BufferedReader( 21 new InputStreamReader(socket.getInputStream())); 22 PrintWriter writer = new PrintWriter( 23 socket.getOutputStream(), true); 24 // 入力を受け取ったら、大文字に変換の上で応答 25 while (true) { 26 String line = reader.readLine(); 27 if (line == "q") { 28 break; 29 } 30 31 writer.println(line.toUpperCase()); 32 System.out.println(line); 33 } 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41}

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

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

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

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

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

guest

回答1

0

ベストアンサー

TCPクライアント側になるプログラムは、一連の通信が終わったらソケットを閉じる必要があります。

//bufwriter.close();
//socket.close();

のコメントアウトを取り除きましょう。

ポートを開きっぱなしにするのはサーバー側となるプログラムです。


簡易TCPサーバーのサンプル

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.net.InetSocketAddress; 5import java.net.ServerSocket; 6import java.net.Socket; 7 8public class Server { 9 public static void main(String[] args) { 10 try { 11 ServerSocket server = new ServerSocket(); 12 server.bind(new InetSocketAddress(4000)); // ポート4000で待ち受ける 13 // 無限ループで待ち受けを続ける 14 while (true) { 15 Socket socket = server.accept(); // 接続を受け付け 16 BufferedReader reader = new BufferedReader( 17 new InputStreamReader(socket.getInputStream())); 18 String line; 19 // 受信した本文を標準出力に表示する 20 while ((line = reader.readLine()) != null) { 21 System.out.println(line); 22 } 23 } 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 } 28}

投稿2017/11/27 14:50

編集2017/11/28 09:42
keicha_hrs

総合スコア6768

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

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

退会済みユーザー

退会済みユーザー

2017/11/28 01:00

今サーバー側のプログラムをSv.javaとして載せたのですが、これを変えればいいのでしょうか?
keicha_hrs

2017/11/28 06:41

netcatコマンドを使うのではなかったのですか?もしnetcatを簡易サーバーとする方法がわからなかったのなら、 netcat -lk -p 4000 でできると思います。(Linuxでは検証済み、macOSだとわからないが多分同じ) sv.javaの方は、これではサーバーになりません。JavaのServerSocketクラスを調べてみましょう。
退会済みユーザー

退会済みユーザー

2017/11/28 07:30

また、新しくServer.javaを作ったのですが、Exception in thread "main" java.lang.NullPointerException at Server.main(Server.java:30)とエラーが出てしまいました
keicha_hrs

2017/11/28 09:48 編集

どこからか丸写ししてきたコードのようですが、意味を理解して引用しないと決して思うようには動いてくれませんよ? 簡易的ですがサーバーになるコードを回答欄に書いてみました。これで連続して受け取れると思います。
keicha_hrs

2017/11/28 09:52

あと、質問のタグがJavaScriptになっていますが、全く関係ないので修正しておくべきでしょう。
退会済みユーザー

退会済みユーザー

2017/11/28 13:22

すいません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問