Java tcp套接字转换为udp

标签 java sockets 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:套接字接受已在主循环中捕获。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 字节)。唯一的好处是速度快且开销最小。

所以你应该尽早创建足够的缓冲区。如果你想模拟流,你必须在数据报之上实现你自己的协议(protocol)。同样,面向连接的 TCP 是在无连接的 IP 协议(protocol)之上实现的。

关于Java tcp套接字转换为udp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22240994/

相关文章:

c# - 用于 Android 或 Java 和 WCF 的单声道

objective-c - 在 XCode 6 中找不到 sockaddr_in(在 OS X 10.10 Yosemite 上)

java - 从java套接字发送文件到c++linux套接字

c++ - 仅使用UDP托管小型服务器应用程序的缺点是什么?

c - 尝试使用线程和计时器通过 UDP 发送两条不同的消息失败

java - 如何在 Java 中获取 DatagramSocket (UDP) 的本地地址

java - 是否有 Spring ORM/JPA 继任者或替代 TopLinkJpaVendorAdapter?

java - @ConditionalOnMissingBean 和 @ConditionalOnBean 位于同一类型上

java - 从上面的包扩展类

php - 在两个应用程序之间传输大量数据的最快方式