0

データを送受信したい (unicode utf-8 文字列を udp ソケットを介してDatagramSocket)InputStream

UDPにも同様の方法はありますか?

UDP クライアント

package testsocket;

import java.io.IOException;
import java.net.*;

public class TestSocketSender {

    private DatagramSocket sock;

    public static void main(String[] args) {
        new TestSocketSender();
    }

    public TestSocketSender(){
        try {
            sock = new DatagramSocket();//, Inet4Address.getLocalHost());
            sendData("Hello World\u00A9");
        } catch (SocketException ex) {
            ex.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        }
    }

    private void sendData(String data) throws IOException{
        DatagramPacket datagram = new DatagramPacket(data.getBytes("utf-8"), data.length(), InetAddress.getLocalHost(), 5060);
        sock.send(datagram);
    }
}

UDP サーバー

package testsocket;

import java.io.IOException;
import java.net.*;

public class TestSocketListerner {

    private DatagramSocket sock;

    public static void main(String[] args) {
        new TestSocketListerner();
    }

    public TestSocketListerner(){
        try {
            sock = new DatagramSocket(5060);//, Inet4Address.getLocalHost());
            while(true){
                System.out.println(recvData());
            }
            } catch (SocketException ex) {
            ex.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        }
    }

    private String recvData() throws IOException{
        byte[] data = new byte[100];
        DatagramPacket datagram = new DatagramPacket(data , data.length);
        sock.receive(datagram);
        return new String(datagram.getData(),datagram.getOffset(),datagram.getLength(),"utf-8");
    }


}
4

2 に答える 2

1

UDP はデータグラムベースのプロトコルです。これは、配信されるデータに関する保証なしに、一定量のデータしか送信できないことを意味します。UDP では CRC も必須ではないため、パケットが失われたり、内部のデータが破損したりする可能性があります。さらに悪いことに、パケットの途中に複数のルーターがあるため、送信したパケットが受信側で並べ替えられる可能性があります。

UDP チャネルを使用してストリームのように見えるものを実装することは簡単ではありませんが、確実に可能です。データを小さな部分 (システムの MTU) に分割し、回復情報をパックし、各パケットにシーケンス番号を割り当て、途中で失われたパケットを再要求するメカニズムを提供する必要があります。

于 2012-05-22T09:14:11.347 に答える
-1

最初に長さを送ってください。

送信者に最初にバイトをパックしてから、長さ、次に文字列を送信してもらいます。4バイトにパックすることをお勧めします。

リーダーに 4 バイトを読み取らせ、長さを再構築してから文字列を読み取らせます。

その後、データが到着しない、タイムアウトするなどの問題を処理できます...

于 2012-05-22T09:17:13.187 に答える