Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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_Tcp - Fatal编程技术网

Java 异常TCP行为;发送和接收数据是不同的

Java 异常TCP行为;发送和接收数据是不同的,java,tcp,Java,Tcp,我正在使用JAVA在分布式网络上实现距离向量协议。我将所有节点的跳数值存储在哈希表中,并将其传递给邻居节点。我正在检查哈希表中存在的键的数量,然后通过MessageSender(自写类)传递它,在邻居端收到此哈希表后,我再次检查存在的键的数量,结果显示短了1个键。它发生在特定情况下,而不是在所有可预测的情况下。你能告诉我这里有什么问题吗? 我尝试用ArrayList数据结构代替哈希表 发送块为: synchronized(TCPServer.node_list) { msg.nodesD

我正在使用JAVA在分布式网络上实现距离向量协议。我将所有节点的跳数值存储在哈希表中,并将其传递给邻居节点。我正在检查哈希表中存在的键的数量,然后通过MessageSender(自写类)传递它,在邻居端收到此哈希表后,我再次检查存在的键的数量,结果显示短了1个键。它发生在特定情况下,而不是在所有可预测的情况下。你能告诉我这里有什么问题吗? 我尝试用ArrayList数据结构代替哈希表

发送块为:

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,它工作得非常好。:)非常感谢。