Java 套接字编程。真的有那么复杂吗?
我开发了一个基于web的JavaEE应用程序。最近,我有一项工作来增加额外的功能——能够向使用.NET平台编程的TCP服务器发送和接收消息。我和另一个人扩展了我们的系统,这样他们可以互相通信和交换字节 然而,这里有一个大问题: 要使它工作几个小时以上而不出现套接字I/O错误,几乎是不可能的。有时TCP服务器需要重新启动,有时我的web服务器需要重新启动,这应该不是问题,因为当两台服务器都在运行时,它们会以5秒的间隔ping自己,如果出现问题,则会再次创建套接字 但正如我所提到的,如果没有得到一些回复,交换信息的时间几乎不可能超过几个小时 不幸的是,我不知道TCP服务器是如何工作的,这对我来说更难找到问题的根源 使用套接字真的那么复杂吗 事实上,我不得不把它当作一个真正的问题。这就是: 你们能给我指一些教程(不是sun网站上那个么简单的教程)或者告诉我一些关于套接字编程的更具体的内容吗?Java的基本客户机-服务器编程 借助本教程中指定的注释,您几乎可以避免所有可能的初学者错误。Java基本客户机-服务器编程Java 套接字编程。真的有那么复杂吗?,java,sockets,Java,Sockets,我开发了一个基于web的JavaEE应用程序。最近,我有一项工作来增加额外的功能——能够向使用.NET平台编程的TCP服务器发送和接收消息。我和另一个人扩展了我们的系统,这样他们可以互相通信和交换字节 然而,这里有一个大问题: 要使它工作几个小时以上而不出现套接字I/O错误,几乎是不可能的。有时TCP服务器需要重新启动,有时我的web服务器需要重新启动,这应该不是问题,因为当两台服务器都在运行时,它们会以5秒的间隔ping自己,如果出现问题,则会再次创建套接字 但正如我所提到的,如果没有得到一些
借助本教程中指定的注释,您几乎可以避免所有可能的初学者错误。互联网如果不稳定,保持TCP连接永久性几乎是不可能的。 例如,一些防火墙会在一段时间没有信息通过后将其断开。 您无权访问的TCP服务器可能也会这样做 我的建议是,每次通过连接发送数据之前,检查它是否仍然处于活动状态,如果没有,请重新连接
如果您还需要从服务器接收数据,因此需要连接始终处于活动状态,则最好定期检查连接是否处于活动状态,如果不是,则重新建立连接。如果internet不稳定,则通过它保持TCP连接的永久性几乎是不可能的。 例如,一些防火墙会在一段时间没有信息通过后将其断开。 您无权访问的TCP服务器可能也会这样做 我的建议是,每次通过连接发送数据之前,检查它是否仍然处于活动状态,如果没有,请重新连接
如果您还需要从服务器接收数据,因此需要连接始终处于活动状态,那么最好定期检查连接是否处于活动状态,如果未处于活动状态,则重新建立连接。通过网络进行通信时,您应该预计会出现一些停机时间,并将客户端和服务器写入容错状态 服务器应该检测客户端何时断开(例如意外的套接字关闭等),并且应该能够接受来自它的新连接。您可以创建某种会话逻辑,以便在客户端需要重新连接时可以保留状态 客户端应该能够检测到它与服务器的连接何时中断,并且应该能够重新连接并继续其工作。自动化这种行为应该不难
如果您有任何类型的UI,那么您应该在脱机运行时向用户显示它正在尝试重新连接。当通过网络进行通信时,您应该预计会出现一些停机时间,并将客户端和服务器写入容错状态 服务器应该检测客户端何时断开(例如意外的套接字关闭等),并且应该能够接受来自它的新连接。您可以创建某种会话逻辑,以便在客户端需要重新连接时可以保留状态 客户端应该能够检测到它与服务器的连接何时中断,并且应该能够重新连接并继续其工作。自动化这种行为应该不难
如果您有任何类型的UI,则应在脱机运行时向用户显示它正在尝试重新连接。您是否绝对确定没有网络问题?请阅读本文档。看看这些例子。“某些套接字I/O错误”。你能公布具体的错误吗?它将提供更多信息。即使存在网络问题,也应在网络问题消除后重新开始工作。现在我们必须一次又一次地重新启动服务器……当出现网络问题时(通常这会转化为ping超时),套接字将断开连接,您必须手动重新连接。重新连接通常不是一件小事,对象需要重新初始化等等。如果在重新启动程序时它可以工作,那么有一种方法可以让它工作,而无需重新启动它。在某些地方,您一定有与Java和.NET交互方式无关的错误代码。您是否绝对确定没有网络问题?请阅读此文档。看看这些例子。“某些套接字I/O错误”。你能公布具体的错误吗?它将提供更多信息。即使存在网络问题,也应在网络问题消除后重新开始工作。现在我们必须一次又一次地重新启动服务器……当出现网络问题时(通常这会转化为ping超时),套接字将断开连接,您必须手动重新连接。重新连接通常不是一件小事,对象需要重新初始化等等。如果在重新启动程序时它可以工作,那么有一种方法可以让它工作,而无需重新启动它。在某些地方,您一定有错误的代码,这些代码与Java和.NET的交互方式无关