java - 如何关闭 UDP 服务器而不引发异常?

标签 java udp

我有一个等待传入客户端消息并使用 UDP 的服务器。当我尝试关闭 Udp 连接时,出现 IOException..

public void run(){


    String user_message = null;

    try {
            connection = startServer();
            System.out.println("Server started");
            while ((true) && (serverStarted) ){

                    try {


                            user_message = receiveMessage();
                            check_query( user_message , "," );

                    } catch ( IOException ex ) {
                            System.out.println("Error1 "+ex.getMessage());
                            setError( "Error establishing connection " ) ;
                            Txt_Log.setText(Txt_Log.getText() + "\n Error establishing connection0") ;
                            break;
                        }
                }
            System.out.println("Server is stopped.....");
        }
    catch ( SocketException ex ) {
            System.out.println("Error2 "+ex.getMessage());
            setError("Error establishing connection ") ;
            Txt_Log.setText(Txt_Log.getText() + "\n Error establishing connection1") ;

       }
    catch( NullPointerException ex){
            System.out.println("Error3 "+ex.getMessage());
            ex.printStackTrace();
            setError("Error Null Pointer ") ;
            Txt_Log.setText(Txt_Log.getText() + "\n Error :"+ex.getMessage()) ;
    }
}





/*
 * Method starts server datagram to bind to port
 */

public DatagramSocket startServer() throws SocketException{

            return new DatagramSocket(10000);
}




/*
 * Method stops server so that server is not able to receive client requests
 */

public void closeServer(){

        if (connection != null){
                //connection.disconnect();
                connection.close();
                //connection = null;

        }
}



/*
 * Method sends message via datagram to client
 */

private void sendMessage( String message ) throws IOException{

        byte[] message_byte = message.getBytes();
        packet_send = new DatagramPacket( message_byte , message_byte.length , packet_receive.getAddress() , packet_receive.getPort() );
        connection.send( packet_send );
}




/*
 * Method receives messages from clients
 */
private String receiveMessage() throws IOException,NullPointerException{
    if (connection!=null){
        byte[] buf = new byte[256];
        packet_receive = new DatagramPacket( buf , buf.length ) ;
        connection.receive( packet_receive ) ;
        return getString( packet_receive );
    }
    throw new NullPointerException("Connection cannot be null");
}



/*
 * Method retrieves data from packet and converts to string
 */

private String getString(DatagramPacket packet){

        String string = new String ( packet.getData() , 0 , packet.getLength()).trim();
        return string;
}


private void drop_DBconnection(){
    if (DB_connection!=null){
        try{
            DB_connection.close();
            //DB_connection = null;

            }
        catch(SQLException e){

                Txt_Log.setText("Server connection Error...");
                setError("Cannot close database connection");
            }

        }
}

public void closeServer(){

        if (connection != null){
                //connection.disconnect();
                connection.close();
                //connection = null;

        }
}

私有(private) void btn_stopActionPerformed(java.awt.event.ActionEvent evt) {

        if ( serverStarted ){

                    Txt_Log.setText( Txt_Log.getText()+"\nServer has been stopped ...." ) ;
                    serverStarted = false ;
                    drop_DBconnection() ;
                    closeServer();

                    btn_start.setEnabled( true ) ;
                    btn_stop.setEnabled( false );

        }       
}                                        

我的输出和堆栈跟踪

Server started
Server is started..... Error1 socket
closed Server is stopped.....
java.net.SocketException: socket closed
         at java.net.PlainDatagramSocketImpl.receive0(NativeMethod)
         at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
         at java.net.DatagramSocket.receive(DatagramSocket.java:712)
         at server.Server.receiveMessage(Server.java:608)
         at server.Server.run(Server.java:528)
         at java.lang.Thread.run(Thread.java:619)

如何关闭服务器以免引发异常?

最佳答案

异常已关闭,因为您关闭了异常。您可以捕获此异常并继续,而不是将其打印出来。这可能是处理此问题的最佳方法。

关于java - 如何关闭 UDP 服务器而不引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4949171/

相关文章:

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

java - Solaris 上的字符集

c++ - 如何 boost Boost ASIO、UDP 客户端应用程序的吞吐量

c - 为什么 UNIX 域数据报套接字的 recvfrom() 返回无效参数?

c# - 我怎样才能让每个客户端都知道连接到同一个 UDP 网络的每个其他客户端?

java - 访问网络状态时出错

java - EJB、 Spring 和 hibernate

java - Spring 休息: Request method 'GET' not supported

node.js - Win 7 上的 UDP 绑定(bind)出现 Nodejs EINVAL 错误

sockets - 从 IAsyncResult UDP 中提取 IP