Javaでは、データを送信して受信するための多くの方法があります。いくつかの方法は下層に近く、プログラマ自身によっていくつかの問題を解決する必要がありますが、いくつかの方法は抽象化が比較的高く、非常に便利に使用できます。データを処理するこれらの方法は、抽象化レベルに応じて低から高になります。
1.手動エンコード:ビット操作を使用して、1つずつエンコードして解析します。
2。ストリームを使用して自動的にエンコードします。AutputStreamを使用し、ByTearRayOutputStreamを組み合わせて使用します。
3。シリアル化:データをデータオブジェクトに入れ、オブジェクトを直接シリアル化して送信します。
使用するのは非常に便利ですが、効率の損失に注意を払う必要があり、受信者はJavaも使用する必要があります。
4.RMI:すべての呼び出しをメソッドに送信し、メソッドのリモートコールを直接実装します。
最低レベルの方法1では、根本的な問題を解決する必要があります。
1。整数送信:それが大きなテールエンドか小さなテールエンドか、署名されていないか署名された整数かを検討してください。
2。文字列の送信:エンコーディングの問題を考慮する必要があります。
3。長さの制限のないタイプ大型整数など:フレームフレームをエンコードするには、各フレームを区切り文字または長さビットで区別します。
マルチキャストと放送
データのコピーを各受信者にユニカストできますが、これは非常に非効率的です。
UDPソケットのみが放送とマルチキャストを許可します。 2つの違いは、放送がネットワーク上のすべての到達可能なホストに送信されることであり、一部のオペレーティングシステムでは、通常のユーザーがブロードキャスト操作を実行できない場合があります。一方、マルチキャストは興味のあるホストにのみ送信されます。具体的には、マルチキャストソケットのJoingRoup()を呼び出して、マルチキャストグループのホストに参加します。
public class multicastreceivertest {public static void main(string [] args)throws exception {final inetAddressアドレス= inetAddress.getByname( "224.1.1.1"); Final Int Port = 45599; for(int i = 0; i <5; i ++){newスレッド( "スレッド#"+i){@Override public void run(){try {multiCastSocket sock = new MultiCastSocket(port); sock.joingroup(アドレス); byte [] msg = new byte [256]; datagrampacket packet = new datagrampacket(msg、msg.length); sock.receive(packet); system.out.println(thread.currentthread()。getName() + "receive:" + new String(packet.getData())); } catch(ioexception e){e.printstacktrace(); } } } }。始める(); } thread.sleep(2000); MultiCastSocket Sock = new MultiCastSocket(); sock.settimetolive(32); byte [] msg = "hellomulticast" .getBytes(); datagrampacketパケット= new datagrampacket(msg、msg.length、address、port); sock.send(packet); system.out.println( "メッセージ送信"); }}