Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidのソケットを使用したデータの送受信


この例は、Androidでのソケットを使用したデータの送受信について示しています

サーバーとクライアントプロジェクトが必要

サーバー

ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。

ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "https://schemas.android.com/apk/res/android"
   xmlns:tools = "https://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:layout_height = "match_parent"
   android:layout_margin = "16dp"
   tools:context = ".MainActivity">
   <TextView
      android:id = "@+id/tvIP"
      android:layout_width = "wrap_content"
      android:layout_height = "wrap_content"
      android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" />
   <TextView
      android:id = "@+id/tvPort"
      android:layout_width = "wrap_content"
      android:layout_height = "wrap_content"
      android:layout_below = "@+id/tvIP"
      android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" />
   <TextView
      android:id = "@+id/tvConnectionStatus"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_below = "@+id/tvPort"
      android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" />
   <TextView
      android:id = "@+id/tvMessages"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_above = "@+id/etMessage"
      android:layout_below = "@+id/tvConnectionStatus"
      android:inputType = "textMultiLine"
      android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" />
   <EditText
      android:id = "@+id/etMessage"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_above = "@+id/btnSend"
      android:hint = "Enter Message"
      android:inputType = "text" />
   <Button
      android:id = "@+id/btnSend"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_alignParentBottom = "true"
      android:text = "SEND" />
</RelativeLayout>

ステップ3 −次のコードをsrc / MainActivity.java

に追加します
package com.server.myapplication.server;
import android.annotation.SuppressLint;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

@SuppressLint("SetTextI18n")
public class MainActivity extends AppCompatActivity {
   ServerSocket serverSocket;
   Thread Thread1 = null;
   TextView tvIP, tvPort;
   TextView tvMessages;
   EditText etMessage;
   Button btnSend;
   public static String SERVER_IP = "";
   public static final int SERVER_PORT = 8080;
   String message;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      tvIP = findViewById(R.id.tvIP);
      tvPort = findViewById(R.id.tvPort);
      tvMessages = findViewById(R.id.tvMessages);
      etMessage = findViewById(R.id.etMessage);
      btnSend = findViewById(R.id.btnSend);
      try {
         SERVER_IP = getLocalIpAddress();
      } catch (UnknownHostException e) {
         e.printStackTrace();
      }
      Thread1 = new Thread(new Thread1());
      Thread1.start();
      btnSend.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            message = etMessage.getText().toString().trim();
            if (!message.isEmpty()) {
               new Thread(new Thread3(message)).start();
            }
         }
      });
   }
   private String getLocalIpAddress() throws UnknownHostException {
      WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
      assert wifiManager ! = null;
      WifiInfo wifiInfo = wifiManager.getConnectionInfo();
      int ipInt = wifiInfo.getIpAddress();
      return InetAddress.getByAddress(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(ipInt).array()).getHostAddress();
   }
   private PrintWriter output;
   private BufferedReader input;
   class Thread1 implements Runnable {
      @Override
      public void run() {
         Socket socket;
         try {
            serverSocket = new ServerSocket(SERVER_PORT);
            runOnUiThread(new Runnable() {
               @Override
               public void run() {
                  tvMessages.setText("Not connected");
                  tvIP.setText("IP: " + SERVER_IP);
                  tvPort.setText("Port: " + String.valueOf(SERVER_PORT));
               }
            });
            try {
               socket = serverSocket.accept();
               output = new PrintWriter(socket.getOutputStream());
               input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
               runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                     tvMessages.setText("Connected\n");
                  }
               });
               new Thread(new Thread2()).start();
            } catch (IOException e) {
               e.printStackTrace();
            }
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
   private class Thread2 implements Runnable {
      @Override
      public void run() {
         while (true) {
            try {
               final String message = input.readLine();
               if (message ! = null) {
                  runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                        tvMessages.append("client:" + message + "\n");
                     }
                  });
               } else {
                  Thread1 = new Thread(new Thread1());
                  Thread1.start();
                  return;
               }
            } catch (IOException e) {
               e.printStackTrace();
            }
         }  
      }
   }
   class Thread3 implements Runnable {
      private String message;
      Thread3(String message) {
         this.message = message;
      }
      @Override
      public void run() {
         output.write(message);
         output.flush();
         runOnUiThread(new Runnable() {
            @Override
            public void run() {
               tvMessages.append("server: " + message + "\n");
               etMessage.setText("");
            }
         });
      }
   }
}

ステップ4 −次のコードをandroidManifest.xmlに追加します

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "https://schemas.android.com/apk/res/android"
   package = "com.example.myapplication">
   <uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />
   <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
   <uses-permission android:name = "android.permission.INTERNET"/>
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:roundIcon = "@mipmap/ic_launcher_round"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
      <activity android:name = ".MainActivity"
         android:label = "Server">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

クライアント

ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。

ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "https://schemas.android.com/apk/res/android"
   xmlns:tools = "https://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:layout_height = "match_parent"
   android:layout_margin = "16dp"
   tools:context = ".MainActivity">
   <EditText
      android:id = "@+id/etIP"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:hint = "IP-Address"
      android:inputType = "text" />
   <EditText
      android:id = "@+id/etPort"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_below = "@+id/etIP"
      android:hint = "Port No"
      android:inputType = "number" />
   <Button
      android:id = "@+id/btnConnect"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_below = "@+id/etPort"
      android:layout_gravity = "center"
      android:layout_marginTop = "16dp"
      android:text = "Connect To Server" />
   <TextView
      android:id = "@+id/tvMessages"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_above = "@+id/etMessage"
      android:layout_below = "@+id/btnConnect"
      android:inputType = "textMultiLine"
      android:textAppearance = "@style/Base.TextAppearance.AppCompat.Medium" />
   <EditText
      android:id = "@+id/etMessage"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_above = "@+id/btnSend"
      android:hint = "Enter Message"
      android:inputType = "text" />
   <Button
      android:id = "@+id/btnSend"
      android:layout_width = "match_parent"
      android:layout_height = "wrap_content"
      android:layout_alignParentBottom = "true"
      android:text = "SEND" />
</RelativeLayout>

ステップ3 −次のコードをres / layout/MainActivity.javaに追加します。

package com.client.myapplication.client;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

@SuppressLint("SetTextI18n")
public class MainActivity extends AppCompatActivity {
   Thread Thread1 = null;
   EditText etIP, etPort;
   TextView tvMessages;
   EditText etMessage;
   Button btnSend;
   String SERVER_IP;
   int SERVER_PORT;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      etIP = findViewById(R.id.etIP);
      etPort = findViewById(R.id.etPort);
      tvMessages = findViewById(R.id.tvMessages);
      etMessage = findViewById(R.id.etMessage);
      btnSend = findViewById(R.id.btnSend);
      Button btnConnect = findViewById(R.id.btnConnect);
      btnConnect.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            tvMessages.setText("");
            SERVER_IP = etIP.getText().toString().trim();
            SERVER_PORT = Integer.parseInt(etPort.getText().toString().trim());
            Thread1 = new Thread(new Thread1());
            Thread1.start();
         }
      });
      btnSend.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            String message = etMessage.getText().toString().trim();
            if (!message.isEmpty()) {
               new Thread(new Thread3(message)).start();
            }
         }
      });
   }
   private PrintWriter output;
   private BufferedReader input;
   class Thread1 implements Runnable {
      public void run() {
         Socket socket;
         try {
            socket = new Socket(SERVER_IP, SERVER_PORT);
            output = new PrintWriter(socket.getOutputStream());
            input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            runOnUiThread(new Runnable() {
               @Override
               public void run() {
                  tvMessages.setText("Connected\n");
               }
            });
            new Thread(new Thread2()).start();
         } catch (IOException e) {
         e.printStackTrace();
         }
      }
   }
   class Thread2 implements Runnable {
      @Override
      public void run() {
         while (true) {
            try {
               final String message = input.readLine();
               if (message ! = null) {
                  runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                        tvMessages.append("server: " + message + "\n");
                     }
                  });
               } else {
                  Thread1 = new Thread(new Thread1());
                  Thread1.start();
                  return;
               }
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
   }
   class Thread3 implements Runnable {
      private String message;
      Thread3(String message) {
         this.message = message;
      }
      @Override
      public void run() {
         output.write(message);
         output.flush();
         runOnUiThread(new Runnable() {  
            @Override
            public void run() {
               tvMessages.append("client: " + message + "\n");
               etMessage.setText("");
            }
         });
      }
   }
}

ステップ4 −次のコードをandroidManifest.xmlに追加します

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "https://schemas.android.com/apk/res/android"
   package = "com.client.myapplication.client">
   <uses-permission android:name = "android.permission.INTERNET" />
   <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:roundIcon = "@mipmap/ic_launcher_round"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
      <activity
         android:name = "com.client.myapplication.client.MainActivity"
         android:label = "Client">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

サーバーとクライアントの両方のアプリケーションを実行してみましょう。実際のAndroidモバイルデバイスをコンピューターに接続していると思います。 Android Studioからアプリを実行するには、プロジェクトのアクティビティファイルの1つを開き、[実行]をクリックします ツールバーのAndroidのソケットを使用したデータの送受信 アイコン。オプションとしてモバイルデバイスを選択し、デフォルトの画面を表示するモバイルデバイスを確認します–

サーバー:-

Androidのソケットを使用したデータの送受信

クライアント:-

Androidのソケットを使用したデータの送受信

サーバー:-

Androidのソケットを使用したデータの送受信


  1. Android でのテキストの送受信の問題を修正

    今日では、SMS サービスは時代遅れで過去の遺物に感じられるかもしれませんが、テキストを介した通信の最も信頼できる方法です。しかし、他のタイプのテクノロジーと同様に、信頼性と効率性を高めるために解決しなければならない独自の問題があります。メッセージの送受信ができないという問題は、Android 端末では最初から当たり前のことでした。この問題は、ブランド、モデル、またはバージョンに関係なく、ほぼすべての Android デバイスで報告されているため、広く知られています。 ユーザーは通常、手遅れになるまで問題に気付かないため、テキスト メッセージの欠落や遅延は問題になる可能性があります。人々がこ

  2. Android でのデータ使用状況を管理および追跡する方法

    なんらかの質問があるたびに、スマートフォンのロックを解除し、回答や解決策を求めて Google に問い合わせます。これだけでなく、オンライン取引、ビデオ通話による友人とのコミュニケーション、タクシーの予約、オンライン ショッピング、またはお気に入りのビデオの視聴にもスマートフォンを使用しています。しかし、これらすべてのアクティビティはモバイル データに多大な負担をかけ、多くの場合、電話代が膨れ上がります。したがって、ユーザーがデータの使用状況を注意深く監視することが非常に重要です。 これには、データ追跡アプリを利用することもできます。 Google Play には、データの使用量を管理および監