我是靠谱客的博主 忐忑小笼包,最近开发中收集的这篇文章主要介绍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();

}

}

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

谢谢 .

最后

以上就是忐忑小笼包为你收集整理的java重新连接tcp_发送紧急数据后重置TCP连接的全部内容,希望文章能够帮你解决java重新连接tcp_发送紧急数据后重置TCP连接所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部