想改善这个问题吗?更新问题,使其仅通过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/