对等方重置连接:套接字写入错误。我的Java代码有什么问题
我试图从一个独立的java应用程序创建并维护到主机的TCP连接 本地端口和服务器端口相同=8999。 连接后,我必须向服务器发送消息:对等方重置连接:套接字写入错误。我的Java代码有什么问题,java,sockets,tcp,tcpdf,socketexception,Java,Sockets,Tcp,Tcpdf,Socketexception,我试图从一个独立的java应用程序创建并维护到主机的TCP连接 本地端口和服务器端口相同=8999。 连接后,我必须向服务器发送消息:用户名=fred&password=abcd 套接字创建和消息发送的代码如下所示: Socket socket = new Socket("mshxml.abcd.com", 8999, InetAddress.getLocalHost(), 8999); OutputStream outStream = socket.getOutputStream(); w
用户名=fred&password=abcd
套接字创建和消息发送的代码如下所示:
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)时,这个程序会成功运行,我可以在那里接收和发送消息
请帮忙
while (socket.isConnected()) {
问题就在这里
while
循环。这是一条登录消息:只需发送一次。服务器几乎肯定不希望从登录的连接中获得第二个连接,因此它正在关闭isConnected()
不是仍然存在的连接的有效测试。唯一有效的测试是不存在IOException
,例如您得到的异常,这意味着对等方已关闭连接。当您遇到这样的异常时,您所能做的就是关闭套接字并停止尝试。重试毫无意义:连接已断开Socket.isConnected()
只告诉您套接字的状态。没有连接。你连接了这个插座,所以它已连接
注意:您应该在套接字的生命周期中使用相同的流,而不是为每条消息创建一个新的流
问题就在这里
while
循环。这是一条登录消息:只需发送一次。服务器几乎肯定不希望从登录的连接中获得第二个连接,因此它正在关闭isConnected()
不是仍然存在的连接的有效测试。唯一有效的测试是不存在IOException
,例如您得到的异常,这意味着对等方已关闭连接。当您遇到这样的异常时,您所能做的就是关闭套接字并停止尝试。重试毫无意义:连接已断开Socket.isConnected()
只告诉您套接字的状态。没有连接。你连接了这个插座,所以它已连接
注意:您应该在套接字的生命周期中使用相同的流,而不是为每条消息创建一个新的流 @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和下一行之间的连接的想法,您是对的。服务器没有立即关闭连接;只有在调试期间(当服务器有足够的时间分析字节时),我才注意到它正在这样做。@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和下一行之间的连接的想法,您是对的。服务器没有立即关闭连接;只有在调试期间(当服务器有足够的时间分析字节时),我才注意到它正在这样做。我删除了“while”和“Socket.isConnected()”行。我仍然在“dout.writeBytes”(“username=fred&password=abcd”);一行中遇到了相同的错误。基本上,每当我第二次尝试在“dataoutputstream”中写入时,我都会遇到这个错误。(如果我删除这一行,错误将出现在下一行,即当我写ETX时)@EJPIf这是真的,你对应用程序协议的想法是错误的。对等方甚至不认识STX。但我觉得这很难相信。在发送第二行之前,从发送STX到第二行之间没有足够的时间让对等方收到STX并关闭套接字,也没有足够的时间让您的主机收到关闭消息。您是否事先发送了其他无效的内容?我已删除“while”和“Socket.isConnected()”行。我仍然在“dout.writeBytes”(“username=fred&password=abcd”);一行中遇到了相同的错误。基本上,每当我第二次尝试在“dataoutputstream”中写入时,我都会遇到这个错误。(如果我删除这一行,错误将出现在下一行,即当我写ETX时)@EJPIf这是真的,你对应用程序协议的想法是错误的。对等方甚至不认识STX。但我觉得这很难相信。在发送第二行之前,从发送STX到第二行之间没有足够的时间让对等方收到STX并关闭套接字,也没有足够的时间让您的主机收到关闭消息。您是否事先发送了其他无效的内容?“本地端口和服务器端口相同=8999”为什么?“本地端口和服务器端口相同=8999”为什么?此代码不起作用。您不会让我相信服务器需要无限多的登录字符串,并且
isConnected()
测试仍然无效。您已更改了其他内容。while语句错误地添加到此处。更新了代码。现在你不会让我相信,一旦你删除了循环,原始版本中的DataOutputStream
代码就不起作用了<代码>写入程序不适用于二进制数据。此代码不起作用。您不会让我相信服务器需要无限多的登录字符串,并且isConnected()
测试仍然无效。你换了别的东西。而语句在这里被错误地添加了。更新了代码。现在是y