java - 如何修复 Java 中的 UDP 服务器?

标签 java oop udp

我在通过 TCP 传输数据时遇到问题。所以我正在编写一个 UDP 服务器,但它不工作,显示以下错误,我该如何解决?

我的错误:

run:
UDP Server started
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:657)
    at socket.UDPHandler.start(UDPHandler.java:25)
    at socket.UDPServer.waitForConnections(UDPServer.java:27)
    at socket.UDPServer.main(UDPServer.java:46)
BUILD STOPPED (total time: 14 seconds)

UDPServer.java

package socket;
import java.net.*;
import java.io.*;

public class UDPServer 
{
    private int serverPort = 0;
    private DatagramSocket serverSock = null;
    //private Socket sock = null;

    public UDPServer(int serverPort) throws IOException 
    {
        this.serverPort = serverPort;
        serverSock = new DatagramSocket(serverPort);
        System.out.println("UDP Server started");
    }

    public void waitForConnections() 
    {
        while (true) 
        {
            try {
                //sock = serverSock.accept();
                //System.err.println("Accepted new socket");
                UDPHandler handler = new UDPHandler(serverSock);
                handler.start();
            }
            catch (IOException e){
                e.printStackTrace(System.err);
            }
        }
    }

    public static void main(String argv[]) 
    {
        int port = 8889;

        UDPServer server = null;
        try {
            server = new UDPServer(port);
        }
        catch (IOException e){
            e.printStackTrace(System.err);
        }
        server.waitForConnections();
    }

}

UDPHandler.java

package socket;
import java.io.*;
import java.net.*;
import main.*;
public class UDPHandler implements Runnable 
{
    private DatagramSocket sock = null;
    private DatagramPacket sockInput = null;
    private DatagramPacket sockOutput = null;
    private Thread myThread = null;

    public UDPHandler(DatagramSocket sock) throws IOException 
    {
        this.sock = sock;
        //sockInput = new DatagramPacket();
        //sockOutput = sock.getOutputStream();
        this.myThread = new Thread(this);
    }

    public void start() 
    {
        myThread.start();
    }

    public void run() 
    {
        while(true) 
        {
            byte[] buf=new byte[1024];
            int bytes_read = 0;
            try {                                
                // Incoming - Test                
                sockInput = new DatagramPacket(buf, buf.length);
                sock.receive(sockInput);
                bytes_read = sockInput.getLength();                
                String data = new String(sockInput.getData());
                System.err.println("DATA: " +  bytes_read + " bytes, data=" +data);

                // IP - Test
                InetAddress IPAddress = sockInput.getAddress();
                int port = sockInput.getPort();

                // Sending - Test
                sockOutput = new DatagramPacket(data.getBytes(), data.length(), IPAddress, port);
                sock.send(sockOutput);

            } catch (Exception e) {
                e.printStackTrace(System.err);
                break;
            }
        }

        try {
            System.err.println("Closing socket.");
            sock.close();
        } catch (Exception e) {
            System.err.println("Exception while closing socket, e="+e);
            e.printStackTrace(System.err);
        }

    }

}

最佳答案

您正在 waitForConnection() 方法的 while(true) 循环中创建无限数量的线程。您应该在服务器中调用 DatagramSocket receive() 方法(它是阻塞操作),如果收到数据报,则将其处理委托(delegate)给某个处理程序(例如从线程池中检索)。

关于java - 如何修复 Java 中的 UDP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7422753/

相关文章:

java - 在 Maven 中运行 JUnit 测试,无需构建和复制文件

java - 日志消息 "Not subject to any constraint"在 Tomcat 7 中意味着什么?

javascript - 在 JavaScript 中声明类的字段的推荐方法是什么?

c++ - 是否可以自动序列化 C++ 对象?

Java 如何使用instanceof返回一个新的对象类型?

javascript - WebRTC 数据通道服务器到客户端的 UDP 通信

java - 在哪里可以从 Twitter 搜索返回的 HttpClient 获取 http 响应代码?

java - HTTPUrlConnection 和 .torrent 文件

python - UNIX 数据报套接字返回数据给发送者

c# - 在 Windows Phone 7 中异步接收 UDP 单播数据包的问题