我正在尝试制作一个点对点文件传输程序,但是在最初交换“这是我拥有的部分”时遇到了一些问题在新来的同伴和那些已经在那里的人之间。
基本上,一旦新到达的对等方(我们称之为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循环)。
在主件接收回路中:
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
}
暂无答案!
目前还没有任何答案,快来回答吧!