Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TCP数据包从未到达套接字?_Java_Multithreading_Sockets_Tcp - Fatal编程技术网

Java TCP数据包从未到达套接字?

Java TCP数据包从未到达套接字?,java,multithreading,sockets,tcp,Java,Multithreading,Sockets,Tcp,我正在尝试制作一个点对点文件传输程序,但在新到达的同龄人和已经到达的同龄人之间最初交换“这是我拥有的东西!”时,我遇到了一些问题 本质上,一旦新到达的对等方(我们称之为B)与已经存在的对等方(我们称之为a)建立TCP连接(总是成功),它将发送一个表示它拥有的文件片段的数组。这在大多数情况下都是成功的,但对于第3、第4或第5个对等方加入6个对等方会话,a将发送其阵列,但B有时不会接收它。通常会丢失一个或两个阵列。然而,他们继续交换棋子,或者交流得很好——只是现在B永远不会知道A在B加入之前是否收到

我正在尝试制作一个点对点文件传输程序,但在新到达的同龄人和已经到达的同龄人之间最初交换“这是我拥有的东西!”时,我遇到了一些问题

本质上,一旦新到达的对等方(我们称之为B)与已经存在的对等方(我们称之为a)建立TCP连接(总是成功),它将发送一个表示它拥有的文件片段的数组。这在大多数情况下都是成功的,但对于第3、第4或第5个对等方加入6个对等方会话,a将发送其阵列,但B有时不会接收它。通常会丢失一个或两个阵列。然而,他们继续交换棋子,或者交流得很好——只是现在B永远不会知道A在B加入之前是否收到了棋子

就基础设施而言,对等点之间的每个连接都在其自己的线程中。只有该线程从连接它们的套接字读取或写入数据。在任何给定的时间,所有线程之间都有大量的通信,但是在每个线程中,它总是往返于一个套接字;虽然有一个“线程管理者”进行一些额外的协议管理(虽然没有读写套接字),但当对等方刚刚连接时,没有一个协议真正起作用

有什么原因可以解释,或者有什么方法可以解决这个问题?相关代码如下。应该注意的是,这实际上是唯一缺失的通信。其他一切都算在内了

在建立连接之后:

locked = true; //a volatile boolean
byte[] pieces = this.makePacket(piecesArray)
this.out.write(pieces);
locked = false
“locked”(锁定)如果为true,将阻止对等方对其数组进行任何更新,直到再次为false为止。这是为了解决发送的阵列没有完全更新的问题。”“锁定”仅在收到工件更新消息时评估真实性(进入while循环)

在主件receival回路中:

byte [] sizeField = new byte[4];
this.in.read(sizeField);
int size = ByteBuffer.wrap(sizeField).getInt();

byte[] packet = new byte[size];
int bytesRead = this.in.read(packet);
while (bytesRead < size)
{
     bytesRead = bytesRead + this.in.read(packet, bytesRead, size-bytesRead);
}

if(packet.getMessage() == "Pieces")
{
     //store em -- if the piece array exchange message doesn't arrive, the code in here never runs
}
byte[]sizeField=新字节[4];
此.in.read(sizeField);
int size=ByteBuffer.wrap(sizeField.getInt();
字节[]数据包=新字节[大小];
int bytesRead=this.in.read(数据包);
while(字节读取<大小)
{
bytesRead=bytesRead+this.in.read(数据包,bytesRead,大小bytesRead);
}
if(packet.getMessage()==“碎片”)
{
//存储em——如果片段数组交换消息没有到达,这里的代码永远不会运行
}

我不确定是否遵循:新用户(B)总是将其条目列表发送给第一个用户(a),即使已经有多个用户?在第一次进入应用程序时,用户将获得当前运行的所有其他用户的条目列表。A代表任何预先存在的用户,而B代表最新的用户。启动应用程序后,B将与之前的每个人联系,并与他们交换工件列表,然后等待(在另一个线程中)接收新的传入连接。您可以使用Wireshark来确定数据是否真的传输到了电线上吗?那么你就知道哪一端失败了。我不确定我是否会这样做:一个新用户(B)总是将其条目列表发送给第一个用户(a),即使已经有多个用户?在第一次进入应用程序时,用户将获得当前运行的所有其他用户的条目列表。A代表任何预先存在的用户,而B代表最新的用户。启动应用程序后,B将与之前的每个人联系,并与他们交换工件列表,然后等待(在另一个线程中)接收新的传入连接。您可以使用Wireshark来确定数据是否真的传输到了电线上吗?那你就知道哪一个目的失败了。