我正在尝试从独立的 java 应用程序创建并维护到主机的 TCP 连接。
本地端口和服务器端口相同= 8999。
连接后,我必须向服务器发送一条消息:< STX >username=fred&password=abcd< ETX >
.
创建套接字和发送消息的代码如下:
Socket socket = new Socket("mshxml.abcd.com", 8999, InetAddress.getLocalHost(), 8999);
OutputStream outStream = socket.getOutputStream();
while (socket.isConnected()) {
try {
int stx = 2, etx = 3;
DataOutputStream dout = new DataOutputStream(outStream);
dout.writeByte(stx);
dout.writeBytes("username=fred&password=abcd");
dout.writeByte(etx);
} catch (Exception e) {
e.printStackTrace();
}
但连接不会持续存在。在调试时,我发现以下错误:
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeBytes(Unknown Source)
at com.voya.socketprog.CClient.createConnection(CClient.java:120)
at com.voya.socketprog.CClient.createSocket(CClient.java:33)
at com.voya.socketprog.CClient.main(CClient.java:138) Line 120 is: dout.writeBytes("username=fred&password=abcd");
注意:当连接到我的计算机上的虚拟服务器(本地主机)时,该程序可以成功运行,我可以在其中接收和发送消息。
请帮忙。
while (socket.isConnected()) {
问题就在这里。
没有理由while
首先循环。这是一条登录消息:只需发送一次。服务器几乎肯定不会期望来自登录连接的第二个连接,因此它正在关闭。
isConnected()
不是一个有效的测试联系仍然存在。唯一有效的测试是没有IOException
例如您收到的,这意味着对等方已关闭连接。当你遇到这样的异常时,你所能做的就是关闭套接字并停止尝试。重试是没有意义的:连接已经消失。
Socket.isConnected()
只告诉您有关的状态Socket.不是连接的。您连接了此套接字,因此它已连接。
注意:您应该在套接字的生命周期内使用相同的流,而不是为每条消息创建一个新的流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)