Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        3年前关闭。
                                                                                            
                
        
出于学习目的,我正在编写Java TCP服务器。这被包装为自己的类,即SyteTCPServer,该类使用ServerSocket处理连接逻辑。这是针对学校项目的,良好的代码惯例非常重要。

之所以将其放在自己的类中,是因为存在特定的应用程序级协议。该课程是一个较大项目的一部分。

谷歌搜索时,我只发现人们将所有ServerSocket及其伴随的逻辑直接放在main方法中。对于OOP,我不确定这是要走的路吗?

我的SyteTCPServer有一个简单的Start()Stop()方法,它隐藏了使用ServerSocket,处理客户端等的实现。

但是,我有些困惑,因为IntelliJ通过许多联网功能警告我赶上IOExceptions。接受客户端可能会引发IOException,因此可以获取该客户端的输出流,writeBytes,..也可以理解我的意思。

在抽象的上下文中,如何最好地处理这些异常?是否在方法旁边写一个throws IOException,使上层代码try...catch成为SyteTCPServer.Start

另外,整个服务器是否应该停止运行,否则将发生任何异常,还是我“隐藏”其中一个客户端未正确连接的事实?或者,当客户端连接失败时,我应该触发事件吗?我真的不知道

由于UI /核心代码分离,当发生类似瘟疫的异常时,我也避免写输出。

我希望这些不是一个问题太多。

这是我拥有的start方法的示例,抛出IOException异常:

public void Start() throws IOException {
    this.listenSocket = new ServerSocket(this.port);

    Listen();
}

最佳答案

我认为,区分可能会收到的不同IOException非常重要。例如,在创建新连接时是例外还是在建立连接时例外,这是否是某种预期的错误?最简单的方法是只读取documentation并根据实际发生的错误进行处理:

对于构造服务器套接字:


  公共ServerSocket(int端口)抛出IOException
  
  
  IOException-如果打开套接字时发生I / O错误。
  SecurityException-如果安全管理器存在并且其checkListen方法不允许该操作。
  IllegalArgumentException-如果port参数超出有效端口值的指定范围,且范围在0到65535(含)之间。
  


对于接受连接:


  公共套接字accept()抛出IOException
  
  
  IOException-如果在等待连接时发生I / O错误。
  SecurityException-如果安全管理器存在并且其checkAccept方法不允许该操作。
  SocketTimeoutException-如果先前使用setSoTimeout设置了超时并且已经达到超时。
  IllegalBlockingModeException-如果此套接字具有关联的通道,则该通道处于非阻塞模式,并且没有准备好接受的连接
  


等等。

关于在何处捕获异常:这还取决于您希望服务器在特定情况下执行的操作。但通常,捕获“预期”错误并在那里进行处理,然后将非故意错误提高到更高的水平。

我的意思是:

public void foo() throws IOException {
    try {
        serverSocket = new ServerSocket(PORT);
    } catch (IOException e) {
        // Port is in use -> perhaps retry on another port
        // If things fail, throw exception anyway
    } finally {
        if (!serverSocket.isClosed()) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                // This exception is to be taken care of internally, not thrown
            }
        }
    }
}


还要注意,这不仅适用于服务器端,也适用于客户端。

祝您写服务器好运!

关于java - Java TCP服务器类抽象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36112810/

10-12 02:53