簡體   English   中英

Java tcp套接字轉換為udp

[英]Java tcp socket conversion to udp

目前我有這種形式的套接字的tcp版本。

final ServerSocket serverSocketConn = new ServerSocket(9000);               
               while (true) 
                    {
                        try
                        {
                                Socket socketConn1 = serverSocketConn.accept();
                                new Thread(new ConnectionHandler(socketConn1)).start();                     
                        }
                        catch(Exception e)
                        {
                            System.out.println("MyError:Socket Accepting has been caught in main loop."+e.toString());
                            e.printStackTrace(System.out);
                        }
                    }
class ConnectionHandler implements Runnable {

    private Socket receivedSocketConn1;
    ConnectionHandler(Socket receivedSocketConn1) {
      this.receivedSocketConn1=receivedSocketConn1;
    }

     try{
          BufferedWriter bWriter =  new BufferedWriter(new OutputStreamWriter(receivedSocketConn1.getOutputStream()));
         BufferedReader bReader = new BufferedReader(new InputStreamReader(receivedSocketConn1.getInputStream()));

     }

}

它工作正常,所以我正在將其轉換為UDP。

public class commUDP9000 {
  class ReceiverThread implements Runnable {
    private DatagramSocket  receivedSocketConn1;
    ReceiverThread(DatagramSocket  receivedSocketConn1) {
      System.out.println("Thread Received");
      this.receivedSocketConn1=receivedSocketConn1;
    }
    public void run(){
        while (true){
            try{
                    //                      
             final byte[] buffer = new byte[1024];
             final DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
             receivedSocketConn1.receive(receivePacket);
             String sentence = new String( receivePacket.getData());                   
             System.out.println("RECEIVED: " + sentence);   
            }
            catch(Exception e){
                System.out.println("MyError:Socket Accepting has been caught in main loop."+e.toString());
                e.printStackTrace(System.out);
            }
        }
     }
   }
   public static void main(String[] args) {
       new commUDP9000();
   }
   commUDP9000() {     
      try{
               final DatagramSocket  serverSocketConn = new DatagramSocket (9000);
               new Thread(new ReceiverThread(serverSocketConn)).start();                            

      } 
      catch (Exception e) 
      {
         System.out.println("MyError:Socket Conn has been caught in main loop."+e.toString());
         e.printStackTrace(System.out);
         //System.exit(0); 
      }
   }
}

我運行這個並最終結束

MyError:Socket Accepting已在主循環中捕獲.java.net.BindException:地址已在使用中

您無法在UDP上創建連接,因為它是無連接的。

DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);

DatagramPacket packet = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);

這里只允許發送和接收。

使用UDP,您可以做的是,將一個數據包發送到另一端。 如果您有數據包序列,則將它們視為單個數據包。 交貨不保證。 每條消息的有效負載限制大約為64kbites。 理論上,但取決於你的網絡MTU(可能是1500字節)。 唯一的好處是它的快速和開銷是最小的。

所以你應該盡早創建一個足夠的緩沖區。 如果要模擬流,則必須在Datagram之上實現自己的協議。 同樣,面向連接的TCP在無連接IP協議之上實現。

你只是創建了無限的線程,所有線程都只是從同一個套接字接收。 您只需要其中一個,循環應該在其run()方法中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM