我正在尝试从独立的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");
注意:当我连接到我的机器上的虚拟服务器(localhost)时,同样的程序可以成功运行,我可以接收和发送消息。
请帮忙。
答案 0 :(得分:0)
while (socket.isConnected()) {
问题出在这里。
首先没有while
循环的原因。这是一条登录消息:它只需要发送一次。服务器几乎肯定不会期望从登录连接中获得第二个,因此它正在关闭。
isConnected()
不是仍然存在的连接的有效测试。唯一有效的测试是没有IOException
,例如你得到的那个,这意味着对等关闭了连接。当你得到这样的例外时,你所能做的只是关闭套接字并停止尝试。重试毫无意义:连接已经消失。
Socket.isConnected()
仅告诉您套接字的状态。不是连接。您已连接此套接字,因此已连接。
注意:您应该在套接字的生命周期中使用相同的流,而不是为每个消息创建一个新流。
答案 1 :(得分:-1)
@EJP @weston这个问题在受到重创之后得到了解决。审判。工作代码如下:
Socket socket = new Socket("mshxml.abcd.com", 8999, InetAddress.getLocalHost(), 8999);
OutputStream outStream = socket.getOutputStream();
try {
String STX = new Character((char) 2).toString();
String ETX = new Character((char) 3).toString();
OutputStreamWriter osw = new OutputStreamWriter(outStream);
BufferedWriter bw = new BufferedWriter(osw);
bw.write( STX + "username=fred&password=abcd" + ETX );
bw.flush();
} catch (Exception e) {
e.printStackTrace();
}
但我不知道为什么这段代码有效,而原始代码却没有。任何建议将不胜感激。非常感谢您提出我的疑问和重复的帖子。 :)
@EJP关于你关于服务器关闭接收STX和下一行之间的连接的想法,你是对的。服务器没有立即关闭连接;它只是在调试期间(当服务器有足够的时间来分析字节时),我注意到它正在这样做。