`
showerhan
  • 浏览: 11763 次
社区版块
存档分类
最新评论

一个JAVA模拟实现的停等协议

阅读更多

计算机网络——自顶向下方法,第三章编程作业,实现可靠传输协议,这里写了一个模拟停等协议的程序,没有写GBN的。

分组丢失和ACK丢失都是通过随机数进行模拟的。

 

接收方程序:

import java.io.*;
import java.net.*;

public class Receiver extends Thread{
	 private boolean OutServer = false; 
	 private static ServerSocket server ; 
	 private static  int ServerPort = 9878; 
	
	public static void main(String[] args) {
		(new Receiver()).start();
		}
	
	public Receiver() 
	  { 
	    try 
	    { 
	      server = new ServerSocket(ServerPort); 
	    } 
	    catch(java.io.IOException e) 
	    { 
	      System.out.println("Socket啟動有問題 !" ); 
	      System.out.println("IOException :" + e.toString()); 
	    } 
	  } 	
	
	public void run() 
	  { 
	    Socket socket ; 
	    ObjectInputStream in ; 
	 
	    System.out.println("伺服器已啟動 !"  ); 
	    while(!OutServer) 
	    { 
	      socket = null; 
	      try 
	      { 
	        synchronized(server) 
	        { 
	          socket = server.accept(); 
	        } 
	        //System.out.println("取得連線 : InetAddress = " + socket.getInetAddress()); 
	        socket.setSoTimeout(15000); 
	 
	 
	        in = new ObjectInputStream(socket.getInputStream()); 
	 
	        Msg data = (Msg)in.readObject(); 
	        System.out.println("发送端正在发送的内容"+data.getN_msg()+"  状态:"+data.getInfo()); 
	        if(data.getInfo().equals("losePackage"))
	        {
	        	System.out.println("分组丢失");
	        	DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
	        	dos.writeBytes("resend1"+'\n');
	        	dos.close();
	        }
	        else if(data.getInfo().equals("loseAck"))
	        {
	        	System.out.println("ACK丢失");
	        	DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
	        	dos.writeBytes("resend2"+'\n');
	        	dos.close();
	        }
	        else
	        {
	        	System.out.println("接收分组 "+data.getN_msg()+"   发送ACK "+data.getN_msg());
	        	DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
	        	dos.writeBytes("ok"+'\n');
	        	dos.close();
	        }
	        System.out.println();
	        
	        
	        in.close(); 
	        in = null ; 
	        socket.close();
	 
	      } 
	      catch(java.io.IOException e) 
	      { 
	    	  System.out.println("Socket連線有問題111 !" ); 
	    	  System.out.println("IOException :" + e.toString()); 
	      } 
	      catch(java.lang.ClassNotFoundException e) 
	      { 
	    	  System.out.println("ClassNotFoundException :" + e.toString()); 
	      } 
	    } 
	  } 
	
}

 发送端程序

import java.io.*;
import java.net.*;

public class Sender extends Thread{
	private String address = "127.0.0.1"; 
	 private int port = 9878; 
	 
	 public Sender() {
		 Socket client = null ;
		 for(int i=0;i<10; i++)
		 {
			 client = new Socket() ;
			 Msg data = new Msg(i%2); 
			 InetSocketAddress isa = new InetSocketAddress(this.address,this.port); 
	        try 
	        { 
	        	client.connect(isa,10000); 
	        	ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream()); 
	        	
	        	out.writeObject(data); 
	        	System.out.println("发送分组 "+data.getN_msg());
	        	
	        	
	        	BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		        String str = br.readLine();
		        if(str.equals("resend1"))
		        {
		        	System.out.println("分组丢失,重发");
		        	i--;
	        		out.flush(); 
		        	out.close(); 
		        	out = null ; 
		        	data = null ;
		        	client.close();
					client = null ; 
	        		continue;
		        }
		        else if(str.equals("resend2"))
		        {
		        	System.out.println("ACK丢失,重发");
		        	i--;
	        		out.flush(); 
		        	out.close(); 
		        	out = null ; 
		        	data = null ;
		        	client.close();
					client = null ; 
	        		continue;
		        }
		        else System.out.println("\n"+"接收ACK"+data.getN_msg()+"      发送分组"+(data.getN_msg()+1)%2);
	        	
	        	
	        	out.flush(); 
	        	out.close(); 
	        	out = null ; 
	        	data = null ;
	        	client.close();
				client = null ; 
	 
	        } 
	        catch(java.io.IOException e) 
	        { 
	          System.out.println("Socket連線有問題 222!" ); 
	          System.out.println("IOException :" + e.toString()); 
	        } 
	        try {
				this.sleep(8000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		 }
	}
	 
	public static void main(String[] args) {
		new Sender();
	}

}

 信息类Msg:

import java.io.Serializable;
import java.util.*;

public class Msg implements Serializable{
	private int n_msg;
	private String info;
	private Random random; 
	private int rdNum;
	
	public Msg(int n_msg) {
		this.n_msg = n_msg;
		MsgState();
	}
	
	public void MsgState(){//用于模拟分组丢失,ACK丢失等情况
		random = new Random();
		rdNum = Math.abs(random.nextInt())%100;
		if (rdNum<20) info = "losePackage";
		else if(rdNum>80) info ="loseAck";
		else info ="noError";
 		
	}
	
		
	public int getN_msg() {
		return n_msg;
	}
	public void setN_msg(int n_msg) {
		this.n_msg = n_msg;
	}

	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}
}
 
分享到:
评论

相关推荐

    java实现 模拟帧传输停等协议

    通过以上知识点,你可以构建一个基本的Java模拟帧传输停等协议的程序。需要注意的是,实际应用中可能会遇到网络延迟、丢包等问题,因此在设计时要充分考虑这些因素,以提高协议的健壮性和效率。

    Java实现停等协议

    现在,我们来看如何在Java中利用这些方法实现停等协议: 1. **定义一个共享的缓冲区对象**:在Java中,我们可以创建一个类来表示数据帧,并包含一个标志位,表明数据帧是否已被接收并确认。这个对象将作为`wait()`...

    计算机网络 滑动窗口协议模拟java

    滑动窗口协议是计算机网络中数据传输的一种流量控制机制,主要应用于TCP(传输控制协议)中,用于确保数据的正确...这个Java小程序不仅是一个学术练习,也是软件工程实践的一部分,帮助开发者熟悉网络协议的实现细节。

    停止等待ARQ模拟代码

    停止等待ARQ协议的核心思想是:发送方每发送一个数据包后会暂停发送后续的数据包,直到接收到接收方对该数据包的确认(ACK)或否定确认(NAK)。如果在规定的时间内没有收到确认消息,则认为数据包丢失或确认消息...

    ARQ java模拟ARQ simulator(计算机网络)

    在这个Java模拟项目中,ARQ机制通过停等请求重传和GO-BACK-N两种协议得以实现。下面将详细阐述这两种ARQ协议及其在Java中的实现。 1. **停等请求重传ARQ(Stop-and-Wait ARQ)**: 停等请求重传是最简单的ARQ协议...

    ARQ 停止等待协议

    以下是一个简单的C语言实现示例: ```c #include #include #include &lt;unistd.h&gt; // for sleep() #include // 定义数据帧和确认帧结构 struct Frame { int seq_num; char data[100]; }; // 假设send_frame和...

    滑动窗口协议模拟程序

    总之,"滑动窗口协议模拟程序"是一个极好的教学工具,对于学习网络协议和理解数据通信中的流量控制至关重要。通过实践和观察,我们可以深入掌握滑动窗口协议的工作原理,这对于网络编程和网络工程的专业人士来说是...

    基于Java的停车管理系统的设计与实现.zip

    在这个项目中,我们将深入探讨如何使用Java语言来设计并实现这样一个系统。 一、系统设计 1. **系统架构**:基于Java的停车管理系统通常采用三层架构,包括表现层(用户界面)、业务逻辑层(控制处理)和数据访问...

    停车场模拟系统

    综上所述,停车场模拟系统是一个综合性的信息系统项目,涉及到软件工程的多个环节,包括需求分析、系统设计、编码实现和测试评估。通过这样的课程设计,学生能够深入理解软件开发的全过程,并提升解决实际问题的能力...

    ARQ.rar_arq java_clothingypn_everythinga8x_mine4v7_实验arq模拟

    这个“ARQ.rar”压缩包包含了一个基于Java编程语言实现的ARQ模拟实验,名为“ARQ.java”,以及可能与实验相关的其他文件,如“clothingypn”、“everythinga8x”和“mine4v7”。这些可能是特定项目、用户或版本的...

    实验 2:可靠数据传输协议 -GBN协议的设计与实现1

    8. **停-等协议**:当GBN协议的发送窗口大小设为1时,它就变成了停-等协议,每次只发送一个数据包,等待确认后再发送下一个。 9. **服务器端和客户端的角色**:服务器接收请求,打包数据报并发送,同时启动计时器...

    Desoutter 马头拧紧控制器协议

    7. **应用开发**:在实际工程中,开发者可能会创建一个上位机程序,使用Desoutter控制器协议与多个拧紧设备通信,实现批量生产环境下的自动化拧紧控制。程序可能需要处理多线程、并发控制、错误处理等问题,以确保...

    classic_java_piano.rar_java 钢琴

    MidiSynth.java可能就是对这个接口的一个具体实现。它负责接收MIDI消息,并将其转化为可听见的声音。这包括音符的启停控制、音色选择、音量调节等多个方面。程序员可以通过MidiSynth来控制合成器的各种参数,以达到...

    基于事件的停止和等待 ARQ 模拟:模拟 ARQ 技术-matlab开发

    停止等待ARQ协议的基本思想是,发送方每次发送一个数据帧后,都会进入等待状态,直到接收到接收方的确认(ACK)信息,才继续发送下一个数据帧。如果发送方没有收到ACK,它会重新发送前一个数据帧。这种协议确保了每...

    停车场管理模拟系统.zip (源码+论文+PPT)

    停车场管理模拟系统是一个综合性...综上所述,停车场管理模拟系统是一个综合运用多种IT技术的项目,涵盖了从数据库设计、前端开发到后端实现、测试和项目管理等多个方面,对于学习和提升计算机专业知识具有很高的价值。

    ARQ.rar_ARQ_JAVA 通信_arq java_停止等待ARQ_数据帧丢失

    在“ARQ.rar”压缩包中,有两个关键文件:“www.pudn.com.txt”可能包含了关于ARQ协议的额外信息或者用于测试的输入数据,而“网络停等ARQ模拟”可能是Java源代码文件,用于实现上述的停止等待ARQ协议模拟。...

    gbn.rar_GBN 演示_arq java

    本资源"gbn.rar"包含了一个ARQ协议的详细动画演示,以及名为"gbn.java"的Java源代码,旨在帮助我们深入理解GBN的工作原理及其编程实现。 GBN(Go-Back-N)协议的核心思想是,发送方在收到接收方对前N个分组的确认...

    20151910042-刘鹏-CN实验05-基于UDP-IP协议与Socket接口的可靠通信编程实验1

    实验内容包括在前期实验的基础上,编程实现RDT协议的不同版本,特别是RDT 3.0,这是一个简单的停等协议。发送方一次发送一个分组,等待超时后重传,若收到错误的ACK或破损的分组也重传。接收方则保持与RDT 2.2相同的...

    毕业设计,Java停车场管理系统后端,内置车牌识别功能.zip

    这是一个基于Java技术实现的毕业设计项目,主要涵盖了停车场管理系统的后端部分,并且集成了车牌识别功能。在本文中,我们将深入探讨这个系统的核心组成部分、技术选型以及可能涉及的关键知识点。 1. **核心技术栈*...

Global site tag (gtag.js) - Google Analytics