java重新连接tcp_发送紧急数据后重置TCP连接

我目前正在调试两个通过TCP连接交换数据的Java应用程序 .

其中一个应用程序TCP客户端通过调用Socket#sendUrgentData(int)定期向另一个TCP服务器发送紧急数据 . 在第18次尝试发送紧急数据时,TCP客户端抛出以下异常

java.io.IOException:BrokenPipe

at java.net.PlainSocketImpl.socketSendUrgentData(Native Method)

at java.net.PlainSocketImpl.sendUrgentData(PlainSocketImpl.java:541)

at java.net.Socket.sendUrgentData(Socket.java:927)

TCP服务器抛出此异常

java.net.SocketException: Software caused connection abort: recv failed

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(Unknown Source)

at java.net.SocketInputStream.read(Unknown Source)

我认为异常是由尝试写入/读取已关闭的连接/套接字引起的 . 我不明白为什么连接或套接字在调用sendUrgentData()17次后关闭 . 我能够重复它,它总是在17次之后发生 .

如果我在Windows上运行客户端和服务器,则会出现问题 . 如果我在Solaris上运行客户端和服务器,则不会发生此问题 . 如果我在Solaris和Windows上的服务器上运行客户端,则会出现问题 . 如果我在Windows上运行客户端,在Solaris上运行服务器,则不会出现问题 . 这让我觉得它可能与Windows有关吗?

使用Wireshark我在连接上看到以下流量

--> = from TCP client to TCP server

--> [PSH, ACK, URG] (Seq=1, Ack=1)

--> [PSH, ACK, URG] (Seq=2, Ack=1)

...

--> [PSH, ACK, URG] (Seq=17, Ack=1)

我写了一些简单的测试类来显示问题 .

TCPServer.java IP_Address端口

public class TCPServer

{

public static void main(String[] args) throws Exception

{

ServerSocket socket = new ServerSocket();

socket.bind(new InetSocketAddress(args[0], Integer.parseInt(args[1])));

System.out.println("BOUND/" + socket);

Socket connection = socket.accept();

System.out.println("CONNECTED/" + connection);

int b;

while ((b = connection.getInputStream().read()) != -1) {

System.out.println("READ byte: " + b);

}

System.out.println("CLOSING ..");

connection.close();

socket.close();

}

}

TCPClient.java IP_Address Port Interval_Between_Urgent_Data

public class TCPClient

{

public static void main(String[] args) throws Exception

{

final Socket socket = new Socket();

socket.connect(new InetSocketAddress(InetAddress.getByName(args[0]), Integer.parseInt(args[1])));

System.out.println("CONNECTED/"+socket);

Timer urgentDataTimer = new Timer(true);

urgentDataTimer.scheduleAtFixedRate(new TimerTask()

{

int n = 0;

public void run() {

try {

System.out.println("SENDING URGENT DATA ("+(++n)+") ..");

socket.sendUrgentData(1);

System.out.println("SENT URGENT DATA");

} catch (Exception e) {

e.printStackTrace();

}

}

}, 1000, Integer.parseInt(args[2]));

int b;

while ((b = socket.getInputStream().read()) != 1) {

System.out.println("READ byte: " + b);

}

System.out.println("CLOSING ..");

urgentDataTimer.cancel();

socket.close();

}

}

有人能解释一下这里发生了什么吗?

谢谢 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值