U

AndroidUDPブロードキャストの送受信



Android Udp Broadcast Send



最近、クラスメートと一緒に主要な宿題コースとしてアプリを開発しています。その中で、udpソケット(マルチキャスト)の送受信、tcpソケットの送受信が含まれます。 Javaの素人として、理論的な情報を読んだだけで、実際のプログラミングで多くの問題に遭遇しました。それから、インターネットでこのエリアのブログを検索しました。実際、ルールが設定されているので、誰もが基本的に同じことを書いています。インターネット上のコードは不完全で、いくつかの誤りや脱落があったため、私は多くの回り道をしました。私はコードの書き直しを数え切れないほど押し下げ、デバッグし、ついに実用的なバージョンを立ち上げました。初心者の子供靴が私のブログを見て、少し回り道をしてくれることを願っています。

-----------------------------------------------------------------------------------------------------------------------------------------------



ソースを示してください:

http://www.cnblogs.com/zhangzph/p/4475962.html



-----------------------------------------------------------------------------------------------------------------------------------------------

コードを提供する前に、私のコードが何をしているのかを簡単に紹介しましょう。 A

コードロジック:



このマシンはUDPブロードキャストを送信します

このマシンはスレッドを開始し、他のマシンからのudpブロードキャストをリッスンし、情報を表示します。次に、tcp接続をudpソースに送信します

他のマシンからtcp接続を受信し、情報を表示します

(ここではudpブロードキャスト、代わりにudpマルチキャストを使用します。マルチキャストにはブロードキャストのすべての利点があり、欠点が少なく、実装は比較的簡単です。ここではあまり紹介しません)

特定のUI操作:

開始ボタンはudpマルチキャストを開始するために使用され、停止ボタンは送信を停止します(実際、開始ボタンはudpマルチキャストの送信後に一度だけ送信されるため、停止ボタンはsetEnabled操作にのみ使用されます)以下の2つのTextViewがあります、送信TextView表示の内容-本機はtcpソケットの情報を送信します内容は受信のTextView表示-本機は他のマシンからudpソケットとtcpソケットの情報を受信します。

注意すべきいくつかのポイント:

1. Androidマニフェストの権限設定、SDKバージョン情報:

この記事に含まれるこれらの関数は、Androidの権限を取得する必要があります。以下は、私の権限とバージョン情報です。

package com.example.user.anjay import android.app.Activity import android.os.Bundle import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.View import android.widget.Button import android.widget.TextView import com.example.user.anjay.R import org.apache.http.conn.util.InetAddressUtils import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader import java.net.DatagramPacket import java.net.InetAddress import java.net.MulticastSocket import java.net.NetworkInterface import java.net.ServerSocket import java.net.Socket import java.net.SocketException import java.util.Enumeration public class MyActivity extends Activity { private static String LOG_TAG = 'WifiMulticastActivity' Button startBroadCast Button stopBroadCast TextView send_label TextView receive_label /* 3 variables for udpReceiveAndTcpSend */ Socket socket = null MulticastSocket ms = null DatagramPacket dp @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_my) startBroadCast = (Button) findViewById(R.id.start) stopBroadCast = (Button) findViewById(R.id.stop) send_label = (TextView) findViewById(R.id.send_information) receive_label = (TextView) findViewById(R.id.receive_information) send_label.append(' ') receive_label.append(' ') startBroadCast.setOnClickListener(listener) stopBroadCast.setOnClickListener(listener) /* Open a thread to receive tcp connection */ new tcpReceive().start() /* Open a thread to receive udp multicast and send tcp connection */ new udpReceiveAndtcpSend().start() } private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { if (v == startBroadCast ) { startBroadCast.setEnabled(false) stopBroadCast.setEnabled(true) /* Open a new thread to send udp multicast */ new udpBroadCast('hi ~!').start() } else { startBroadCast.setEnabled(true) stopBroadCast.setEnabled(false) } } } /* Send udp multicast */ private class udpBroadCast extends Thread { MulticastSocket sender = null DatagramPacket dj = null InetAddress group = null byte[] data = new byte[1024] public udpBroadCast(String dataString) { data = dataString.getBytes() } @Override public void run() { try { sender = new MulticastSocket() group = InetAddress.getByName('224.0.0.1') dj = new DatagramPacket(data,data.length,group,6789) sender.send(dj) sender.close() } catch(IOException e) { e.printStackTrace() } } } /* Receive udp multicast and send tcp connection */ private class udpReceiveAndtcpSend extends Thread { @Override public void run() { byte[] data = new byte[1024] try { InetAddress groupAddress = InetAddress.getByName('224.0.0.1') ms = new MulticastSocket(6789) ms.joinGroup(groupAddress) } catch (Exception e) { e.printStackTrace() } while (true) { try { dp = new DatagramPacket(data, data.length) if (ms != null) ms.receive(dp) } catch (Exception e) { e.printStackTrace() } if (dp.getAddress() != null) { final String quest_ip = dp.getAddress().toString() /* If the ip address of the udp packet is the local ip address, discard the packet (not processed) */ //String host_ip = getLocalIPAddress() String host_ip = getLocalHostIp() System.out.println('host_ip: -------------------- ' + host_ip) System.out.println('quest_ip: -------------------- ' + quest_ip.substring(1)) if( (!host_ip.equals('')) && host_ip.equals(quest_ip.substring(1)) ) { continue } final String codeString = new String(data, 0, dp.getLength()) receive_label.post(new Runnable() { @Override public void run() { receive_label.append('Receive udp request from: ' + quest_ip.substring(1) + ' ' +' ') receive_label.append('Request content: '+ codeString + ' ') } }) try { final String target_ip = dp.getAddress().toString().substring(1) send_label.post(new Runnable() { @Override public void run() { send_label.append('Send tcp request to: ' + target_ip + ' ') } }) socket = new Socket(target_ip, 8080) } catch (IOException e) { e.printStackTrace() } finally { try { if (socket != null) socket.close() } catch (IOException e) { e.printStackTrace() } } } } } } /* Receive tcp connection */ private class tcpReceive extends Thread { ServerSocket serverSocket Socket socket BufferedReader in String source_address @Override public void run() { while(true) { serverSocket = null socket = null in = null try { Log.i('Tcp Receive',' new ServerSocket ++++++++++') serverSocket = new ServerSocket(8080) socket = serverSocket.accept() Log.i('Tcp Receive',' get socket ++++++++++++++++') if(socket != null) { in = new BufferedReader(new InputStreamReader(socket.getInputStream())) StringBuilder sb = new StringBuilder() sb.append(socket.getInetAddress().getHostAddress()) String line = null while ((line = in.readLine()) != null ) { sb.append(line) } source_address = sb.toString().trim() receive_label.post(new Runnable() { @Override public void run() { receive_label.append('receive tcp request from: '+' ' +source_address+' '+' ') } }) } } catch (IOException e1) { e1.printStackTrace() } finally { try { if (in != null) in.close() if (socket != null) socket.close() if (serverSocket != null) serverSocket.close() } catch (IOException e) { e.printStackTrace() } } } } } public String getLocalHostIp() { String ipaddress = '' try { Enumeration en = NetworkInterface .getNetworkInterfaces() // The network interface used for traversal while (en.hasMoreElements()) { NetworkInterface nif = en.nextElement()//Get all the ip bound to each network interface Enumeration inet = nif.getInetAddresses() // Traverse all IPs bound to each interface while (inet.hasMoreElements()) { InetAddress ip = inet.nextElement() if (!ip.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ip .getHostAddress())) { return ip.getHostAddress() } } } } catch(SocketException e) { Log.e('feige', 'Failed to obtain local IP address') e.printStackTrace() } return ipaddress } private String getLocalIPAddress() { try { for (Enumeration en = NetworkInterface .getNetworkInterfaces() en.hasMoreElements()) { NetworkInterface intf = en.nextElement() for (Enumeration enumIpAddr = intf .getInetAddresses() enumIpAddr.hasMoreElements()) { InetAddress inetAddress = enumIpAddr.nextElement() if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString() } } } } catch (SocketException ex) { Log.e(LOG_TAG, ex.toString()) } return null } // Close the multicast socket ms when pressing the return key @Override public void onBackPressed() { ms.close() super.onBackPressed() } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.my, menu) return true } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId() if (id == R.id.action_settings) { return true } return super.onOptionsItemSelected(item) } }

上記のエントリの情報はuses-sdkをbuild.gradleファイルで同期する必要があります。

2.udpブロードキャストとudpブロードキャストモニタリングは同じポートにバインドする必要があることに注意してください

3. Android StudioなどのIDE抽出に関連するその他の問題。コードを変更してプログラムを電話に再書き込みすると、キャッシュ内の古いバージョンのコードが使用されてプログラムが書き込まれることがあります。 。 。また、プロジェクトのロードが遅すぎる場合があり、プログラムがクラッシュした後、logcatはエラーメッセージを長時間出力しないため、デバッグに深刻な影響を及ぼします。

4.テストには、AndroidSDKを搭載した新しい携帯電話を使用することをお勧めします。テストしたとき、4.4と5.1の成功を使用しました。別のバージョン4.0.xを混在させると、うまく機能しない場合があります。

githubのプロジェクトリンク:

https://github.com/zhangpzh/Anjay

メインコード:

xmlソースコード:

Javaソースコード:

(上記のgithubのコードは、さまざまな内部通信クラスをモジュール化しました。これは、アクティビティで定義された次のようなものではなくなりました。ただし、アプリの機能に焦点を合わせるために、次のファイルを引き続き表示します)

<LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical' tools:context='.MyActivity'> <LinearLayout android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='horizontal' android:gravity='center_horizontal' > <Button android:id='@+id/start' android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='start' /> <Button android:id='@+id/stop' android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginLeft='150dp' android:text='stop' /> LinearLayout> <LinearLayout android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='horizontal' android:gravity='center_horizontal' > <TextView android:id='@+id/send_information' android:layout_marginTop='50dp' android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='send' android:layout_marginRight='110dp' /> <TextView android:id='@+id/receive_information' android:layout_marginTop='50dp' android:text='receive' android:layout_width='wrap_content' android:layout_height='wrap_content' /> LinearLayout> LinearLayout>

誤りや脱落があった場合は、批判して訂正してください。結局のところ、それは初心者であり、間違いや過失を犯すことは不可能です。

転載:https://www.cnblogs.com/zhangzph/p/4475962.html