计算机网络——自顶向下方法,第三章编程作业,实现可靠传输协议,这里写了一个模拟停等协议的程序,没有写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中利用这些方法实现停等协议: 1. **定义一个共享的缓冲区对象**:在Java中,我们可以创建一个类来表示数据帧,并包含一个标志位,表明数据帧是否已被接收并确认。这个对象将作为`wait()`...
滑动窗口协议是计算机网络中数据传输的一种流量控制机制,主要应用于TCP(传输控制协议)中,用于确保数据的正确...这个Java小程序不仅是一个学术练习,也是软件工程实践的一部分,帮助开发者熟悉网络协议的实现细节。
停止等待ARQ协议的核心思想是:发送方每发送一个数据包后会暂停发送后续的数据包,直到接收到接收方对该数据包的确认(ACK)或否定确认(NAK)。如果在规定的时间内没有收到确认消息,则认为数据包丢失或确认消息...
在这个Java模拟项目中,ARQ机制通过停等请求重传和GO-BACK-N两种协议得以实现。下面将详细阐述这两种ARQ协议及其在Java中的实现。 1. **停等请求重传ARQ(Stop-and-Wait ARQ)**: 停等请求重传是最简单的ARQ协议...
以下是一个简单的C语言实现示例: ```c #include #include #include <unistd.h> // for sleep() #include // 定义数据帧和确认帧结构 struct Frame { int seq_num; char data[100]; }; // 假设send_frame和...
总之,"滑动窗口协议模拟程序"是一个极好的教学工具,对于学习网络协议和理解数据通信中的流量控制至关重要。通过实践和观察,我们可以深入掌握滑动窗口协议的工作原理,这对于网络编程和网络工程的专业人士来说是...
在这个项目中,我们将深入探讨如何使用Java语言来设计并实现这样一个系统。 一、系统设计 1. **系统架构**:基于Java的停车管理系统通常采用三层架构,包括表现层(用户界面)、业务逻辑层(控制处理)和数据访问...
综上所述,停车场模拟系统是一个综合性的信息系统项目,涉及到软件工程的多个环节,包括需求分析、系统设计、编码实现和测试评估。通过这样的课程设计,学生能够深入理解软件开发的全过程,并提升解决实际问题的能力...
这个“ARQ.rar”压缩包包含了一个基于Java编程语言实现的ARQ模拟实验,名为“ARQ.java”,以及可能与实验相关的其他文件,如“clothingypn”、“everythinga8x”和“mine4v7”。这些可能是特定项目、用户或版本的...
8. **停-等协议**:当GBN协议的发送窗口大小设为1时,它就变成了停-等协议,每次只发送一个数据包,等待确认后再发送下一个。 9. **服务器端和客户端的角色**:服务器接收请求,打包数据报并发送,同时启动计时器...
7. **应用开发**:在实际工程中,开发者可能会创建一个上位机程序,使用Desoutter控制器协议与多个拧紧设备通信,实现批量生产环境下的自动化拧紧控制。程序可能需要处理多线程、并发控制、错误处理等问题,以确保...
MidiSynth.java可能就是对这个接口的一个具体实现。它负责接收MIDI消息,并将其转化为可听见的声音。这包括音符的启停控制、音色选择、音量调节等多个方面。程序员可以通过MidiSynth来控制合成器的各种参数,以达到...
停止等待ARQ协议的基本思想是,发送方每次发送一个数据帧后,都会进入等待状态,直到接收到接收方的确认(ACK)信息,才继续发送下一个数据帧。如果发送方没有收到ACK,它会重新发送前一个数据帧。这种协议确保了每...
停车场管理模拟系统是一个综合性...综上所述,停车场管理模拟系统是一个综合运用多种IT技术的项目,涵盖了从数据库设计、前端开发到后端实现、测试和项目管理等多个方面,对于学习和提升计算机专业知识具有很高的价值。
在“ARQ.rar”压缩包中,有两个关键文件:“www.pudn.com.txt”可能包含了关于ARQ协议的额外信息或者用于测试的输入数据,而“网络停等ARQ模拟”可能是Java源代码文件,用于实现上述的停止等待ARQ协议模拟。...
本资源"gbn.rar"包含了一个ARQ协议的详细动画演示,以及名为"gbn.java"的Java源代码,旨在帮助我们深入理解GBN的工作原理及其编程实现。 GBN(Go-Back-N)协议的核心思想是,发送方在收到接收方对前N个分组的确认...
实验内容包括在前期实验的基础上,编程实现RDT协议的不同版本,特别是RDT 3.0,这是一个简单的停等协议。发送方一次发送一个分组,等待超时后重传,若收到错误的ACK或破损的分组也重传。接收方则保持与RDT 2.2相同的...
这是一个基于Java技术实现的毕业设计项目,主要涵盖了停车场管理系统的后端部分,并且集成了车牌识别功能。在本文中,我们将深入探讨这个系统的核心组成部分、技术选型以及可能涉及的关键知识点。 1. **核心技术栈*...