Java 异常TCP行为;发送和接收数据是不同的
我正在使用JAVA在分布式网络上实现距离向量协议。我将所有节点的跳数值存储在哈希表中,并将其传递给邻居节点。我正在检查哈希表中存在的键的数量,然后通过MessageSender(自写类)传递它,在邻居端收到此哈希表后,我再次检查存在的键的数量,结果显示短了1个键。它发生在特定情况下,而不是在所有可预测的情况下。你能告诉我这里有什么问题吗? 我尝试用ArrayList数据结构代替哈希表 发送块为:Java 异常TCP行为;发送和接收数据是不同的,java,tcp,Java,Tcp,我正在使用JAVA在分布式网络上实现距离向量协议。我将所有节点的跳数值存储在哈希表中,并将其传递给邻居节点。我正在检查哈希表中存在的键的数量,然后通过MessageSender(自写类)传递它,在邻居端收到此哈希表后,我再次检查存在的键的数量,结果显示短了1个键。它发生在特定情况下,而不是在所有可预测的情况下。你能告诉我这里有什么问题吗? 我尝试用ArrayList数据结构代替哈希表 发送块为: synchronized(TCPServer.node_list) { msg.nodesD
synchronized(TCPServer.node_list)
{
msg.nodesDetails = TCPServer.node_list;
}
System.out.println("node_list.size "+msg.nodesDetails.size());
synchronized(sender_list)
{
System.out.println("sending node_list contains");
Enumeration<Integer> enumKey = msg.nodesDetails.keys();
while(enumKey.hasMoreElements())
{
Integer key = enumKey.nextElement();
System.out.print(msg.nodesDetails.get(key).nodeNo+","+msg.nodesDetails.get(key).hops+"\t");
}
System.out.println();
for(int i=0 ; i<sender_list.size(); i++)
{
try
{
sender_list.get(i).ooss.writeObject(msg);
System.out.println("Sending TCP msg to "+
sender_list.get(i).receiverNodeNo + " node");
}
catch (IOException e)
{
System.out.println("Send message failed");
e.printStackTrace();
}
}
}
public void run()
{
while(true)
{
try
{
Message msg = (Message)ois.readObject();
System.out.println("Message received from node "+msg.senderId);
Hashtable<Integer, Node> aai = msg.nodesDetails;
int flag = 0;
System.out.println("msg.nodesDetails.size "+msg.nodesDetails.size()+" of node "+msg.senderId);
synchronized(TCPServer.node\u列表)
{
msg.nodesDetails=TCPServer.node_列表;
}
System.out.println(“node_list.size”+msg.nodesDetails.size());
已同步(发件人列表)
{
System.out.println(“发送节点列表包含”);
枚举enumKey=msg.nodesDetails.keys();
while(enumKey.hasMoreElements())
{
整数key=enumKey.nextElement();
System.out.print(msg.nodesDetails.get(key.nodeNo+),“+msg.nodesDetails.get(key.hops+”\t”);
}
System.out.println();
对于(int i=0;i您使用的是ObjectOutputStream
。您是否意识到,它维护着一个已写入对象的缓存,因此,如果您写入一个对象,对其进行修改,然后再次写入,则接收方会两次获得未修改的对象?没有足够的信息来判断这是否是问题所在。这是一个很好的解决方法lp.现在,在发送新数据之前,我正在重置ObjectOutputStream,它工作得非常好。:)非常感谢。