【问题标题】:Run running TCP and UDP server at the same time同时运行 TCP 和 UDP 服务器
【发布时间】:2023-03-28 08:29:01
【问题描述】:

我有一个需要使用 TCP 和 UDP 传输文件的网络编程主题。如果 TCP 发送失败,则会执行 UDP。我已经构建了每个部分,但我不确定如何同时运行 TCP 和 UDP 的服务器才能接收两种协议的数据(我的问题是在主服务器中启动 2 个服务器,因为我有作为接口)。希望大家帮忙。

【问题讨论】:

    标签: java networking server tcp udp


    【解决方案1】:

    在一种情况下您需要打开一个 ServerSocket,在另一种情况下需要打开一个 DatagramSocket。应该可以并行打开它们,这意味着您可以在不同线程上并行运行两个实现。

    【讨论】:

    • 是的,我使用相同的端口,但我无法并行运行两个线程我试过但只有第一个线程执行
    【解决方案2】:

    如果您想在同一台机器上运行 TCP 和 UDP 服务器,您将需要使用不同的端口。然后你可以启动两个不同的线程,每个服务器一个:

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.nio.charset.StandardCharsets;
    import java.util.stream.Collectors;
    
    public class TcpUdpServer {
    
      private final static int UDP_PORT = 8100;
      private final static int TCP_PORT = 8200;
    
      public static void main(String[] args) {
        new Thread(() -> executeTcpServer()).start();
        new Thread(() -> executeUdpServer()).start();
      }
    
      public static void executeTcpServer() {
        try (ServerSocket serverSocket = new ServerSocket(TCP_PORT)) {
          while (true) {
            System.out.println("waiting for TCP connection...");
            // Blocks until a connection is made
            final Socket socket = serverSocket.accept();
            final InputStream inputStream = socket.getInputStream();
            String text = new BufferedReader(
                new InputStreamReader(inputStream, StandardCharsets.UTF_8))
                .lines()
                .collect(Collectors.joining("\n"));
            System.out.println(text);
          }
        } catch (Exception exception) {
          exception.printStackTrace();
        }
      }
    
      public static void executeUdpServer() {
        try (DatagramSocket socket = new DatagramSocket(UDP_PORT)) {
          while (true) {
            byte[] packetBuffer = new byte[2024];
            final DatagramPacket packet = new DatagramPacket(packetBuffer, packetBuffer.length);
            System.out.println("waiting for UDP packet...");
            // Blocks until a packet is received
            socket.receive(packet);
            final String receivedPacket = new String(packet.getData()).trim();
            System.out.println(receivedPacket);
          }
        } catch (Exception exception) {
          exception.printStackTrace();
        }
      }
    
    }
    

    【讨论】:

    • 如果我这样写2个线程,它真的会并行运行吗?或者进程1已经运行完毕,那么进程2就会运行
    • 是的,它们都会同时运行,所以第二个线程不会在第一个线程上等待
    • 是的,我再次尝试成功,但如果我想在 TCP 和 UDP 中进行多线程,有什么办法吗?我尝试编写自己的类来处理它,但是当我将它放在服务器上时,只执行了 1 个 TCP 或 UDP
    • 你能分享一下代码吗?
    • 公共类ServerUDP实现Runnable { DatagramSocket server;公共服务器UDP(int端口){听(端口); } public void listen(int port) { try { System.out.println("ServerUDP: "+port);服务器=新数据报套接字(端口); while(true) { UDPThread UDPThread=new UDPThread(server); UDPThread.start(); } } 捕捉(异常 e){ e.printStackTrace(); } } @Override public void run() { }
    猜你喜欢
    • 2016-11-18
    • 2011-01-19
    • 2015-06-16
    • 2016-01-24
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多