UDP DUPタイムアウトUPDポート状態検出コード例


前に一例を書きましたが、簡単UDPサーバとクライアントの例には、自分をクライアントとして扱うなら、クライアントは自分のポートを指定して数を送ることができます。
ds.setSoTimeout(5000)つまり、受信時間が超過しました。設定しないと、ドラマの中の恋愛映画より長い待ち時間になります。そして、結果は同じです。自分を死ぬまで待つだけです。しかし、このタイムアウトはあなたの要求のタイムアウト時間とはみなされませんので、このタイムアウトはこのタイムアウトをマークするためのものです。この時間はネットからデータを取得していませんが、データを取得しても、必ずしもあなたのものではありません。これは以下の例を見れば分かります。
そしてポートの問題です。上ではポートを自分で指定してもいいです。自分をクライアントとしてもいいです。データを送る時には接続先を作成してデータを送信します。このようにポートはダイナミックです。つまり、Datagram Socketオブジェクトが再初期化されたり消えたりしない限り、ローカルに開いているこのUDPポートは閉じられないということです。
あとはUDPの状態の問題ですが、実は前から文章がありました。UDP接続オブジェクトの理解と使用。無状態とは、この接続は状態がないということです。鬼は彼が果たして服務しているのかどうかを知っています。鬼は、その服務先が彼の最後の死にあったとしても知らないのです。しかし、地元にとって、もしあなたのDatagram Socketオブジェクトがずっと存在するなら、あなたのローカルポートはステータスがあり、彼は生きています。
次に例を示します。

package test;
import java.io.*;
import java.net.*;
import java.util.Arrays;
/**
 * UDP     ,          ,           
 */
public class UdpClientSocket {
	private byte[] buffer = new byte[1024];
	private static DatagramSocket ds = null;
	/**
	 *                  
	 */
	public static void main(String[] args) throws Exception {
		UdpClientSocket client = new UdpClientSocket();
		String serverHost = "127.0.0.1";
		int serverPort = 10002;
		client.send(serverHost, serverPort, new byte[]{1,2,3,4,5});
		while(true){
			byte[] bt = client.receive();
			if(null != bt && bt.length > 0)
				System.out.println("    :" + Arrays.toString(bt));
			Thread.sleep(1000);
		}
	}
	/**
	 *     ,  UDP   
	 */
	public UdpClientSocket() throws Exception {
		ds = new DatagramSocket(8899); //            
		ds.setSoTimeout(5000);
	}
	/**
	 *              
	 */
	public final void send(final String host, final int port,final byte[] bytes) throws IOException {
		DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(host), port);
		ds.send(dp);
	}
	/**
	 *               
	 */
	public final byte[] receive() throws Exception {
		try {
			DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
			ds.receive(dp);		
			byte[] data = new byte[dp.getLength()];
			System.arraycopy(dp.getData(), 0, data, 0, dp.getLength());		
			return data;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
実行中にエラーが発生しました。
java.net.SocketTimeout Exception:Receive timed out
at java.net.PlainDatagram SocketImpl.receive 0(Native Method)
at java.net.PlainDatagram SocketImpl.receive(Plain Datagram SocketImpl.java:136)
at java.net.DatagramSockete.receive(DatagramSockete.java:712)
at test.Udp Client Sockett.receive(Udp Client Sockett.java:46)
at test.Udp Client Sockete.main(Udp Client Sockett.java:20)
java.net.SocketTimeout Exception:Receive timed out
at java.net.PlainDatagram SocketImpl.receive 0(Native Method)
at java.net.PlainDatagram SocketImpl.receive(Plain Datagram SocketImpl.java:136)
at java.net.DatagramSockete.receive(DatagramSockete.java:712)
at test.Udp Client Sockett.receive(Udp Client Sockett.java:46)
at test.Udp Client Sockete.main(Udp Client Sockett.java:20)
TCPUDPDbgを使用して8899にデータを送信すると、受信できます。
受信データ:[16,17,18,19,20]
ここの例にはもう書いてあります。
1.ローカルポートは8899です。
2.受取時間の超過時間は5秒です。
3.地元の10002ポートにデータを送りましたが、鬼は届いたかどうか分かります。
4.ローカルポート8899で受信したUDPデータを継続的に取得する
そして気づく
1.送信データにエラーがない
2.受信回数を間違えて申告している場合、タイムアウトします。
3.TCPUDPDbgを使用して8899にデータを送信すると受信できます。
まとめ:
1.UDPは受信数を指定してタイムアウトしましたが、各要求のタイムアウトは自分でコントロールする必要があります。
2.UDPはローカルポートの送信数を邦定できます。そしてこのポートは状態があります。
3.UDPは状態がないですが、ローカルにあります。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。