java利用socket通信模拟实现ARQ停止等待协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java利用socket通信模拟实现ARQ停止等待协议相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

  1//服务端,发送方
  1 //客户端,接收方
  2 
  3 import java.awt.*;
  4 import java.io.*;
  5 import java.net.*;
  6 import java.util.*;
  7 import javax.swing.*;
  8 
  9 public class IClient extends JFrame  {
 10     JPanel jp = new JPanel();
 11     JTextArea jta = new JTextArea();
 12     JScrollPane jsp = null;
 13 
 14     public IClient()
 15     {
 16         Toolkit t = Toolkit.getDefaultToolkit();
 17         Dimension Size =t.getScreenSize();
 18         int width =  Size.width; 
 19         int height = Size.height;
 20         setLocationByPlatform(true);
 21         this.setAlwaysOnTop(true);
 22         jsp = new JScrollPane(jta);
 23         this.setTitle("接收方");
 24         this.add(jp);
 25         this.setSize(500, 400);
 26         this.setBounds((width - 500) / 2,
 27                 (height - 400) / 2, 600,500);
 28         this.add(jsp, BorderLayout.CENTER);
 29         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 30         this.setVisible(true);
 31     }
 32     public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
 33             new IClient().Receive();        
 34     }
 35 
 36     public void Receive() throws UnknownHostException, IOException, InterruptedException
 37     {
 38         Socket client = new Socket("localhost",9000);
 39         DataOutputStream dos = new DataOutputStream(client.getOutputStream());
 40         DataInputStream dis =new DataInputStream(client.getInputStream());        
 41         int length = dis.read();                                //读取接收数据帧的长度
 42         //System.out.println(length);                                //输出要接受的数据的长度        
 43         for(int i=0;i<length;i++)
 44         {
 45             char c = dis.readChar();                            //接收数据帧,判断是否正确            
 46             if(c!=‘η‘){                                            //CRC数据帧校验正确
 47                 Random ran=new java.util.Random();
 48                 int re=ran.nextInt(13);
 49                 if(re>=4){                                        //数据帧帧数正确
 50                     if(i<length-1)
 51                     {    
 52                         if (jta.getText() == null || "".equals(jta.getText())) {
 53                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 54                         } else {
 55                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 56                         }
 57                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);    //输出接受到的数据帧
 58                         dos.writeInt(i+2);    
 59                     }
 60                     else
 61                     {
 62                         if (jta.getText() == null || "".equals(jta.getText())) {
 63                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 64                         } else {
 65                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 66                         }
 67                         
 68                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);
 69                         dos.writeInt(i+2);                        //向发送方返回确认帧
 70                         Thread.sleep(100);
 71                     }
 72                 }
 73                 else                                            //数据帧内容错误
 74                 {
 75                     if (jta.getText() == null || "".equals(jta.getText())) {
 76                         jta.append("Receive:" + "不是所需要的帧,丢弃等待!");
 77                     } else {
 78                         jta.append("\r\nReceive:" + "不是所需要的帧,丢弃等待!");
 79                     }
 80                     Thread.sleep(600);
 81                     //System.out.println("不是所需要的帧,丢弃等待!");                    
 82                     dos.writeInt(-1);
 83                     i=i-1;
 84                 }    
 85             }
 86             else if(c==‘η‘)                                        //CRC数据帧错误丢弃等待
 87             {
 88                 if (jta.getText() == null || "".equals(jta.getText())) {
 89                     jta.append("Receive:" + "数据帧错误!");
 90                 } else {
 91                     jta.append("\r\nReceive:" + "数据帧错误!");
 92                 }
 93                 //System.out.println("数据帧错误!");                
 94                 i=i-1;
 95                 dos.writeInt(-2);
 96             }        
 97         }
 98         if (jta.getText() == null || "".equals(jta.getText())) {
 99             jta.append( "接收信息成功!");
100         } else {
101             jta.append("\r\n" + "接收信息成功!");
102         }
103         jta.setEnabled(false);
104         //System.out.println("接收信息成功!");
105         client.close();
106     }
107 }

 

  2 
  3 import java.awt.*;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.io.*;
  7 import java.net.*;
  8 import java.security.Timestamp;
  9 import java.util.*;
 10 import java.util.prefs.BackingStoreException;
 11 
 12 import javax.swing.*;
 13 
 14 public class IServer extends JFrame {
 15     private static long  time1;
 16     private static    long  time2;
 17     private JPanel jp = new JPanel();
 18     private JTextArea jta = new JTextArea();
 19     private JScrollPane jsp = null;
 20     private JButton jb = new JButton("发送");
 21     private JTextField jtf = new JTextField(30);
 22     private ServerSocket server;
 23     private Socket socket;
 24     DataOutputStream dos; 
 25     DataInputStream dis;
 26     public IServer() throws IOException
 27     {
 28         Toolkit t = Toolkit.getDefaultToolkit();
 29         Dimension Size =t.getScreenSize();
 30         int width =  Size.width; 
 31         int height = Size.height;
 32         setLocationByPlatform(true);
 33         jsp = new JScrollPane(jta);
 34         this.setTitle("发送方");
 35         this.setSize(600, 500);
 36         this.setBounds((width - 600) / 2,
 37                 (height - 500) / 2, 600,500);
 38         jp.add(jtf);
 39         jp.add(jb);
 40         this.add(jsp, BorderLayout.CENTER);
 41         this.add(jp, BorderLayout.SOUTH);
 42         jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动条自动滚动
 43         this.setVisible(true);
 44         this.setAlwaysOnTop(true);
 45         server = new ServerSocket(9000);
 46         socket= server.accept();
 47         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 48         dos = new DataOutputStream(socket.getOutputStream());
 49         dis =new DataInputStream(socket.getInputStream());
 50         jb.addActionListener(new ActionListener(){
 51             public void actionPerformed(ActionEvent event){
 52                 try {
 53                     Send();
 54                 } catch (InterruptedException | IOException e) {
 55                     // TODO Auto-generated catch block
 56                     e.printStackTrace();
 57                 }
 58             }
 59         });
 60     }
 61     public static void main(String[] args) throws IOException, InterruptedException
 62     {
 63             new IServer();                                
 64     }
 65     public void Send() throws InterruptedException, IOException
 66     {
 67         String info = jtf.getText();
 68         jtf.setText("");
 77         char[] Msg = info.toCharArray();
 78         dos.write(Msg.length);
 79         for(int i=0;i<Msg.length;i++)
 80         {                                                
 81             Random random=new java.util.Random();                        //实现数据帧错传,以随机数的概率来实现                        
 82             int result=random.nextInt(21);
 83             if(result>=4)
 84             {    
 85                 if (jta.getText() == null || "".equals(jta.getText())) {
 86                     jta.append("Sending...:" + Msg[i]);
 87                 } else {
 88                     jta.append("\r\nSending...:" + Msg[i]);
 89                 }
 90                 dos.writeChar(Msg[i]);                                    //发送数据帧
 91                 time1 = System.currentTimeMillis();                        //设置超时计时器                    
 92             }
 93             else
 94             {    
 95                 if (jta.getText() == null || "".equals(jta.getText())) {
 96                     jta.append("Sending...:" + Msg[i]);
 97                 } else {
 98                     jta.append("\r\nSending...:" + Msg[i]);
 99                 }
100                 dos.writeChar(‘η‘);                                        //发送数据帧
101                 time1 = System.currentTimeMillis();                         //设置超时计时器                                                                   
102             }                    
103             int c = dis.readInt();                                        //接受客户端确认帧
104             time2 = System.currentTimeMillis();
105             long time = time2-time1;
106             //System.out.println("接收所用时间:"+time);
107             if(time<500)                                                        //确认帧未超时
108             {
109                 if(c==i+2)                                                    //确认帧正确,传输成功,准备传输下一个帧
110                 { 
111                     if(i<Msg.length-1)
112                     {
113                         if (jta.getText() == null || "".equals(jta.getText())) {
114                             jta.append("Receive:" + c);
115                         } else {
116                             jta.append("\r\nReceive:" + c);
117                         }
118                         //System.out.println("接收方返回帧:"+c+"  第"+(i+1)+"号帧传输成功!");
119                     }
120                     else
121                     {
122                         if (jta.getText() == null || "".equals(jta.getText())) {
123                             jta.append("Receive:" + (i+2)+"数据传输成功!");
124                         } else {
125                             jta.append("\r\nReceive:" + (i+2)+"数据传输成功!");
126                             jta.setEnabled(false);
127                             
128                         }
129                         //System.out.println("第"+(i+1)+"号帧传输成功!");
130                         //System.out.println("数据传输成功!");
131                         server.close();
132                     }        
133                 }
134                 else if(c==-2)                                                        //确认帧出错,超时重传
135                 {
136                     if (jta.getText() == null || "".equals(jta.getText())) {
137                         jta.append("Receive:数据帧出错,丢弃等待....."+
138                                 "确认帧接收超时,重新发送"+(i+1)+"帧");
139                     } else {
140                         jta.append("\r\nReceive:Receive:数据帧出错,丢弃等待....."
141                     +"确认帧接收超时,重新发送"+(i+1)+"帧");
142                     }
143                     //System.out.println("数据帧出错,丢弃等待.....");
144                     Thread.sleep(300);
145                     //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
146                     i=i-1;
147                 }
148             }
149             else//超时,重传
150             {
151                 if (jta.getText() == null || "".equals(jta.getText())) {
152                     jta.append("Receive:" +"确认帧接收超时,重新发送"+(i+1)+"帧");
153                 } else {
154                     jta.append("\r\nReceive:" + "确认帧接收超时,重新发送"+(i+1)+"帧");
155                 }
156                 //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
157                 i=i-1;    
158             }    
159         }
160     }
161 }

 

---恢复内容结束---

  1//服务端,发送方
  1 //客户端,接收方
  2 
  3 import java.awt.*;
  4 import java.io.*;
  5 import java.net.*;
  6 import java.util.*;
  7 import javax.swing.*;
  8 
  9 public class IClient extends JFrame  {
 10     JPanel jp = new JPanel();
 11     JTextArea jta = new JTextArea();
 12     JScrollPane jsp = null;
 13 
 14     public IClient()
 15     {
 16         Toolkit t = Toolkit.getDefaultToolkit();
 17         Dimension Size =t.getScreenSize();
 18         int width =  Size.width; 
 19         int height = Size.height;
 20         setLocationByPlatform(true);
 21         this.setAlwaysOnTop(true);
 22         jsp = new JScrollPane(jta);
 23         this.setTitle("接收方");
 24         this.add(jp);
 25         this.setSize(500, 400);
 26         this.setBounds((width - 500) / 2,
 27                 (height - 400) / 2, 600,500);
 28         this.add(jsp, BorderLayout.CENTER);
 29         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 30         this.setVisible(true);
 31     }
 32     public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
 33             new IClient().Receive();        
 34     }
 35 
 36     public void Receive() throws UnknownHostException, IOException, InterruptedException
 37     {
 38         Socket client = new Socket("localhost",9000);
 39         DataOutputStream dos = new DataOutputStream(client.getOutputStream());
 40         DataInputStream dis =new DataInputStream(client.getInputStream());        
 41         int length = dis.read();                                //读取接收数据帧的长度
 42         //System.out.println(length);                                //输出要接受的数据的长度        
 43         for(int i=0;i<length;i++)
 44         {
 45             char c = dis.readChar();                            //接收数据帧,判断是否正确            
 46             if(c!=‘η‘){                                            //CRC数据帧校验正确
 47                 Random ran=new java.util.Random();
 48                 int re=ran.nextInt(13);
 49                 if(re>=4){                                        //数据帧帧数正确
 50                     if(i<length-1)
 51                     {    
 52                         if (jta.getText() == null || "".equals(jta.getText())) {
 53                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 54                         } else {
 55                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 56                         }
 57                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);    //输出接受到的数据帧
 58                         dos.writeInt(i+2);    
 59                     }
 60                     else
 61                     {
 62                         if (jta.getText() == null || "".equals(jta.getText())) {
 63                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 64                         } else {
 65                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 66                         }
 67                         
 68                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);
 69                         dos.writeInt(i+2);                        //向发送方返回确认帧
 70                         Thread.sleep(100);
 71                     }
 72                 }
 73                 else                                            //数据帧内容错误
 74                 {
 75                     if (jta.getText() == null || "".equals(jta.getText())) {
 76                         jta.append("Receive:" + "不是所需要的帧,丢弃等待!");
 77                     } else {
 78                         jta.append("\r\nReceive:" + "不是所需要的帧,丢弃等待!");
 79                     }
 80                     Thread.sleep(600);
 81                     //System.out.println("不是所需要的帧,丢弃等待!");                    
 82                     dos.writeInt(-1);
 83                     i=i-1;
 84                 }    
 85             }
 86             else if(c==‘η‘)                                        //CRC数据帧错误丢弃等待
 87             {
 88                 if (jta.getText() == null || "".equals(jta.getText())) {
 89                     jta.append("Receive:" + "数据帧错误!");
 90                 } else {
 91                     jta.append("\r\nReceive:" + "数据帧错误!");
 92                 }
 93                 //System.out.println("数据帧错误!");                
 94                 i=i-1;
 95                 dos.writeInt(-2);
 96             }        
 97         }
 98         if (jta.getText() == null || "".equals(jta.getText())) {
 99             jta.append( "接收信息成功!");
100         } else {
101             jta.append("\r\n" + "接收信息成功!");
102         }
103         jta.setEnabled(false);
104         //System.out.println("接收信息成功!");
105         client.close();
106     }
107 }

 

  2 
  3 import java.awt.*;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.io.*;
  7 import java.net.*;
  8 import java.security.Timestamp;
  9 import java.util.*;
 10 import java.util.prefs.BackingStoreException;
 11 
 12 import javax.swing.*;
 13 
 14 public class IServer extends JFrame {
 15     private static long  time1;
 16     private static    long  time2;
 17     private JPanel jp = new JPanel();
 18     private JTextArea jta = new JTextArea();
 19     private JScrollPane jsp = null;
 20     private JButton jb = new JButton("发送");
 21     private JTextField jtf = new JTextField(30);
 22     private ServerSocket server;
 23     private Socket socket;
 24     DataOutputStream dos; 
 25     DataInputStream dis;
 26     public IServer() throws IOException
 27     {
 28         Toolkit t = Toolkit.getDefaultToolkit();
 29         Dimension Size =t.getScreenSize();
 30         int width =  Size.width; 
 31         int height = Size.height;
 32         setLocationByPlatform(true);
 33         jsp = new JScrollPane(jta);
 34         this.setTitle("发送方");
 35         this.setSize(600, 500);
 36         this.setBounds((width - 600) / 2,
 37                 (height - 500) / 2, 600,500);
 38         jp.add(jtf);
 39         jp.add(jb);
 40         this.add(jsp, BorderLayout.CENTER);
 41         this.add(jp, BorderLayout.SOUTH);
 42         jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动条自动滚动
 43         this.setVisible(true);
 44         this.setAlwaysOnTop(true);
 45         server = new ServerSocket(9000);
 46         socket= server.accept();
 47         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 48         dos = new DataOutputStream(socket.getOutputStream());
 49         dis =new DataInputStream(socket.getInputStream());
 50         jb.addActionListener(new ActionListener(){
 51             public void actionPerformed(ActionEvent event){
 52                 try {
 53                     Send();
 54                 } catch (InterruptedException | IOException e) {
 55                     // TODO Auto-generated catch block
 56                     e.printStackTrace();
 57                 }
 58             }
 59         });
 60     }
 61     public static void main(String[] args) throws IOException, InterruptedException
 62     {
 63             new IServer();                                
 64     }
 65     public void Send() throws InterruptedException, IOException
 66     {
 67         String info = jtf.getText();
 68         jtf.setText("");
 69         /*if (jta.getText() == null || "".equals(jta.getText())) {
 70             jta.append("Client:" + info);
 71         } else {
 72             jta.append("\r\nClient:" + info);
 73         }*/
 74 
 75         
 76         ///////////////////////////////////
 77         char[] Msg = info.toCharArray();
 78         dos.write(Msg.length);
 79         for(int i=0;i<Msg.length;i++)
 80         {                                                
 81             Random random=new java.util.Random();                        //实现数据帧错传,以随机数的概率来实现                        
 82             int result=random.nextInt(21);
 83             if(result>=4)
 84             {    
 85                 if (jta.getText() == null || "".equals(jta.getText())) {
 86                     jta.append("Sending...:" + Msg[i]);
 87                 } else {
 88                     jta.append("\r\nSending...:" + Msg[i]);
 89                 }
 90                 dos.writeChar(Msg[i]);                                    //发送数据帧
 91                 time1 = System.currentTimeMillis();                        //设置超时计时器                    
 92             }
 93             else
 94             {    
 95                 if (jta.getText() == null || "".equals(jta.getText())) {
 96                     jta.append("Sending...:" + Msg[i]);
 97                 } else {
 98                     jta.append("\r\nSending...:" + Msg[i]);
 99                 }
100                 dos.writeChar(‘η‘);                                        //发送数据帧
101                 time1 = System.currentTimeMillis();                         //设置超时计时器                                                                   
102             }                    
103             int c = dis.readInt();                                        //接受客户端确认帧
104             time2 = System.currentTimeMillis();
105             long time = time2-time1;
106             //System.out.println("接收所用时间:"+time);
107             if(time<500)                                                        //确认帧未超时
108             {
109                 if(c==i+2)                                                    //确认帧正确,传输成功,准备传输下一个帧
110                 { 
111                     if(i<Msg.length-1)
112                     {
113                         if (jta.getText() == null || "".equals(jta.getText())) {
114                             jta.append("Receive:" + c);
115                         } else {
116                             jta.append("\r\nReceive:" + c);
117                         }
118                         //System.out.println("接收方返回帧:"+c+"  第"+(i+1)+"号帧传输成功!");
119                     }
120                     else
121                     {
122                         if (jta.getText() == null || "".equals(jta.getText())) {
123                             jta.append("Receive:" + (i+2)+"数据传输成功!");
124                         } else {
125                             jta.append("\r\nReceive:" + (i+2)+"数据传输成功!");
126                             jta.setEnabled(false);
127                             
128                         }
129                         //System.out.println("第"+(i+1)+"号帧传输成功!");
130                         //System.out.println("数据传输成功!");
131                         server.close();
132                     }        
133                 }
134                 else if(c==-2)                                                        //确认帧出错,超时重传
135                 {
136                     if (jta.getText() == null || "".equals(jta.getText())) {
137                         jta.append("Receive:数据帧出错,丢弃等待....."+
138                                 "确认帧接收超时,重新发送"+(i+1)+"帧");
139                     } else {
140                         jta.append("\r\nReceive:Receive:数据帧出错,丢弃等待....."
141                     +"确认帧接收超时,重新发送"+(i+1)+"帧");
142                     }
143                     //System.out.println("数据帧出错,丢弃等待.....");
144                     Thread.sleep(300);
145                     //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
146                     i=i-1;
147                 }
148             }
149             else//超时,重传
150             {
151                 if (jta.getText() == null || "".equals(jta.getText())) {
152                     jta.append("Receive:" +"确认帧接收超时,重新发送"+(i+1)+"帧");
153                 } else {
154                     jta.append("\r\nReceive:" + "确认帧接收超时,重新发送"+(i+1)+"帧");
155                 }
156                 //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
157                 i=i-1;    
158             }    
159         }
160     }
161 }

 

---恢复内容开始---

  1//服务端,发送方
  1 //客户端,接收方
  2 
  3 import java.awt.*;
  4 import java.io.*;
  5 import java.net.*;
  6 import java.util.*;
  7 import javax.swing.*;
  8 
  9 public class IClient extends JFrame  {
 10     JPanel jp = new JPanel();
 11     JTextArea jta = new JTextArea();
 12     JScrollPane jsp = null;
 13 
 14     public IClient()
 15     {
 16         Toolkit t = Toolkit.getDefaultToolkit();
 17         Dimension Size =t.getScreenSize();
 18         int width =  Size.width; 
 19         int height = Size.height;
 20         setLocationByPlatform(true);
 21         this.setAlwaysOnTop(true);
 22         jsp = new JScrollPane(jta);
 23         this.setTitle("接收方");
 24         this.add(jp);
 25         this.setSize(500, 400);
 26         this.setBounds((width - 500) / 2,
 27                 (height - 400) / 2, 600,500);
 28         this.add(jsp, BorderLayout.CENTER);
 29         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 30         this.setVisible(true);
 31     }
 32     public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
 33             new IClient().Receive();        
 34     }
 35 
 36     public void Receive() throws UnknownHostException, IOException, InterruptedException
 37     {
 38         Socket client = new Socket("localhost",9000);
 39         DataOutputStream dos = new DataOutputStream(client.getOutputStream());
 40         DataInputStream dis =new DataInputStream(client.getInputStream());        
 41         int length = dis.read();                                //读取接收数据帧的长度
 42         //System.out.println(length);                                //输出要接受的数据的长度        
 43         for(int i=0;i<length;i++)
 44         {
 45             char c = dis.readChar();                            //接收数据帧,判断是否正确            
 46             if(c!=‘η‘){                                            //CRC数据帧校验正确
 47                 Random ran=new java.util.Random();
 48                 int re=ran.nextInt(13);
 49                 if(re>=4){                                        //数据帧帧数正确
 50                     if(i<length-1)
 51                     {    
 52                         if (jta.getText() == null || "".equals(jta.getText())) {
 53                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 54                         } else {
 55                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 56                         }
 57                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);    //输出接受到的数据帧
 58                         dos.writeInt(i+2);    
 59                     }
 60                     else
 61                     {
 62                         if (jta.getText() == null || "".equals(jta.getText())) {
 63                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 64                         } else {
 65                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 66                         }
 67                         
 68                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);
 69                         dos.writeInt(i+2);                        //向发送方返回确认帧
 70                         Thread.sleep(100);
 71                     }
 72                 }
 73                 else                                            //数据帧内容错误
 74                 {
 75                     if (jta.getText() == null || "".equals(jta.getText())) {
 76                         jta.append("Receive:" + "不是所需要的帧,丢弃等待!");
 77                     } else {
 78                         jta.append("\r\nReceive:" + "不是所需要的帧,丢弃等待!");
 79                     }
 80                     Thread.sleep(600);
 81                     //System.out.println("不是所需要的帧,丢弃等待!");                    
 82                     dos.writeInt(-1);
 83                     i=i-1;
 84                 }    
 85             }
 86             else if(c==‘η‘)                                        //CRC数据帧错误丢弃等待
 87             {
 88                 if (jta.getText() == null || "".equals(jta.getText())) {
 89                     jta.append("Receive:" + "数据帧错误!");
 90                 } else {
 91                     jta.append("\r\nReceive:" + "数据帧错误!");
 92                 }
 93                 //System.out.println("数据帧错误!");                
 94                 i=i-1;
 95                 dos.writeInt(-2);
 96             }        
 97         }
 98         if (jta.getText() == null || "".equals(jta.getText())) {
 99             jta.append( "接收信息成功!");
100         } else {
101             jta.append("\r\n" + "接收信息成功!");
102         }
103         jta.setEnabled(false);
104         //System.out.println("接收信息成功!");
105         client.close();
106     }
107 }

 

  2 
  3 import java.awt.*;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.io.*;
  7 import java.net.*;
  8 import java.security.Timestamp;
  9 import java.util.*;
 10 import java.util.prefs.BackingStoreException;
 11 
 12 import javax.swing.*;
 13 
 14 public class IServer extends JFrame {
 15     private static long  time1;
 16     private static    long  time2;
 17     private JPanel jp = new JPanel();
 18     private JTextArea jta = new JTextArea();
 19     private JScrollPane jsp = null;
 20     private JButton jb = new JButton("发送");
 21     private JTextField jtf = new JTextField(30);
 22     private ServerSocket server;
 23     private Socket socket;
 24     DataOutputStream dos; 
 25     DataInputStream dis;
 26     public IServer() throws IOException
 27     {
 28         Toolkit t = Toolkit.getDefaultToolkit();
 29         Dimension Size =t.getScreenSize();
 30         int width =  Size.width; 
 31         int height = Size.height;
 32         setLocationByPlatform(true);
 33         jsp = new JScrollPane(jta);
 34         this.setTitle("发送方");
 35         this.setSize(600, 500);
 36         this.setBounds((width - 600) / 2,
 37                 (height - 500) / 2, 600,500);
 38         jp.add(jtf);
 39         jp.add(jb);
 40         this.add(jsp, BorderLayout.CENTER);
 41         this.add(jp, BorderLayout.SOUTH);
 42         jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动条自动滚动
 43         this.setVisible(true);
 44         this.setAlwaysOnTop(true);
 45         server = new ServerSocket(9000);
 46         socket= server.accept();
 47         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 48         dos = new DataOutputStream(socket.getOutputStream());
 49         dis =new DataInputStream(socket.getInputStream());
 50         jb.addActionListener(new ActionListener(){
 51             public void actionPerformed(ActionEvent event){
 52                 try {
 53                     Send();
 54                 } catch (InterruptedException | IOException e) {
 55                     // TODO Auto-generated catch block
 56                     e.printStackTrace();
 57                 }
 58             }
 59         });
 60     }
 61     public static void main(String[] args) throws IOException, InterruptedException
 62     {
 63             new IServer();                                
 64     }
 65     public void Send() throws InterruptedException, IOException
 66     {
 67         String info = jtf.getText();
 68         jtf.setText("");
 77         char[] Msg = info.toCharArray();
 78         dos.write(Msg.length);
 79         for(int i=0;i<Msg.length;i++)
 80         {                                                
 81             Random random=new java.util.Random();                        //实现数据帧错传,以随机数的概率来实现                        
 82             int result=random.nextInt(21);
 83             if(result>=4)
 84             {    
 85                 if (jta.getText() == null || "".equals(jta.getText())) {
 86                     jta.append("Sending...:" + Msg[i]);
 87                 } else {
 88                     jta.append("\r\nSending...:" + Msg[i]);
 89                 }
 90                 dos.writeChar(Msg[i]);                                    //发送数据帧
 91                 time1 = System.currentTimeMillis();                        //设置超时计时器                    
 92             }
 93             else
 94             {    
 95                 if (jta.getText() == null || "".equals(jta.getText())) {
 96                     jta.append("Sending...:" + Msg[i]);
 97                 } else {
 98                     jta.append("\r\nSending...:" + Msg[i]);
 99                 }
100                 dos.writeChar(‘η‘);                                        //发送数据帧
101                 time1 = System.currentTimeMillis();                         //设置超时计时器                                                                   
102             }                    
103             int c = dis.readInt();                                        //接受客户端确认帧
104             time2 = System.currentTimeMillis();
105             long time = time2-time1;
106             //System.out.println("接收所用时间:"+time);
107             if(time<500)                                                        //确认帧未超时
108             {
109                 if(c==i+2)                                                    //确认帧正确,传输成功,准备传输下一个帧
110                 { 
111                     if(i<Msg.length-1)
112                     {
113                         if (jta.getText() == null || "".equals(jta.getText())) {
114                             jta.append("Receive:" + c);
115                         } else {
116                             jta.append("\r\nReceive:" + c);
117                         }
118                         //System.out.println("接收方返回帧:"+c+"  第"+(i+1)+"号帧传输成功!");
119                     }
120                     else
121                     {
122                         if (jta.getText() == null || "".equals(jta.getText())) {
123                             jta.append("Receive:" + (i+2)+"数据传输成功!");
124                         } else {
125                             jta.append("\r\nReceive:" + (i+2)+"数据传输成功!");
126                             jta.setEnabled(false);
127                             
128                         }
129                         //System.out.println("第"+(i+1)+"号帧传输成功!");
130                         //System.out.println("数据传输成功!");
131                         server.close();
132                     }        
133                 }
134                 else if(c==-2)                                                        //确认帧出错,超时重传
135                 {
136                     if (jta.getText() == null || "".equals(jta.getText())) {
137                         jta.append("Receive:数据帧出错,丢弃等待....."+
138                                 "确认帧接收超时,重新发送"+(i+1)+"帧");
139                     } else {
140                         jta.append("\r\nReceive:Receive:数据帧出错,丢弃等待....."
141                     +"确认帧接收超时,重新发送"+(i+1)+"帧");
142                     }
143                     //System.out.println("数据帧出错,丢弃等待.....");
144                     Thread.sleep(300);
145                     //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
146                     i=i-1;
147                 }
148             }
149             else//超时,重传
150             {
151                 if (jta.getText() == null || "".equals(jta.getText())) {
152                     jta.append("Receive:" +"确认帧接收超时,重新发送"+(i+1)+"帧");
153                 } else {
154                     jta.append("\r\nReceive:" + "确认帧接收超时,重新发送"+(i+1)+"帧");
155                 }
156                 //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
157                 i=i-1;    
158             }    
159         }
160     }
161 }

 

---恢复内容结束---

  1//服务端,发送方
  1 //客户端,接收方
  2 
  3 import java.awt.*;
  4 import java.io.*;
  5 import java.net.*;
  6 import java.util.*;
  7 import javax.swing.*;
  8 
  9 public class IClient extends JFrame  {
 10     JPanel jp = new JPanel();
 11     JTextArea jta = new JTextArea();
 12     JScrollPane jsp = null;
 13 
 14     public IClient()
 15     {
 16         Toolkit t = Toolkit.getDefaultToolkit();
 17         Dimension Size =t.getScreenSize();
 18         int width =  Size.width; 
 19         int height = Size.height;
 20         setLocationByPlatform(true);
 21         this.setAlwaysOnTop(true);
 22         jsp = new JScrollPane(jta);
 23         this.setTitle("接收方");
 24         this.add(jp);
 25         this.setSize(500, 400);
 26         this.setBounds((width - 500) / 2,
 27                 (height - 400) / 2, 600,500);
 28         this.add(jsp, BorderLayout.CENTER);
 29         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 30         this.setVisible(true);
 31     }
 32     public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
 33             new IClient().Receive();        
 34     }
 35 
 36     public void Receive() throws UnknownHostException, IOException, InterruptedException
 37     {
 38         Socket client = new Socket("localhost",9000);
 39         DataOutputStream dos = new DataOutputStream(client.getOutputStream());
 40         DataInputStream dis =new DataInputStream(client.getInputStream());        
 41         int length = dis.read();                                //读取接收数据帧的长度
 42         //System.out.println(length);                                //输出要接受的数据的长度        
 43         for(int i=0;i<length;i++)
 44         {
 45             char c = dis.readChar();                            //接收数据帧,判断是否正确            
 46             if(c!=‘η‘){                                            //CRC数据帧校验正确
 47                 Random ran=new java.util.Random();
 48                 int re=ran.nextInt(13);
 49                 if(re>=4){                                        //数据帧帧数正确
 50                     if(i<length-1)
 51                     {    
 52                         if (jta.getText() == null || "".equals(jta.getText())) {
 53                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 54                         } else {
 55                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 56                         }
 57                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);    //输出接受到的数据帧
 58                         dos.writeInt(i+2);    
 59                     }
 60                     else
 61                     {
 62                         if (jta.getText() == null || "".equals(jta.getText())) {
 63                             jta.append("Receive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 64                         } else {
 65                             jta.append("\r\nReceive:" + "成功接收"+(i+1)+"号帧,内容为:"+c);
 66                         }
 67                         
 68                         //System.out.println("成功接收"+(i+1)+"号帧,内容为:"+c);
 69                         dos.writeInt(i+2);                        //向发送方返回确认帧
 70                         Thread.sleep(100);
 71                     }
 72                 }
 73                 else                                            //数据帧内容错误
 74                 {
 75                     if (jta.getText() == null || "".equals(jta.getText())) {
 76                         jta.append("Receive:" + "不是所需要的帧,丢弃等待!");
 77                     } else {
 78                         jta.append("\r\nReceive:" + "不是所需要的帧,丢弃等待!");
 79                     }
 80                     Thread.sleep(600);
 81                     //System.out.println("不是所需要的帧,丢弃等待!");                    
 82                     dos.writeInt(-1);
 83                     i=i-1;
 84                 }    
 85             }
 86             else if(c==‘η‘)                                        //CRC数据帧错误丢弃等待
 87             {
 88                 if (jta.getText() == null || "".equals(jta.getText())) {
 89                     jta.append("Receive:" + "数据帧错误!");
 90                 } else {
 91                     jta.append("\r\nReceive:" + "数据帧错误!");
 92                 }
 93                 //System.out.println("数据帧错误!");                
 94                 i=i-1;
 95                 dos.writeInt(-2);
 96             }        
 97         }
 98         if (jta.getText() == null || "".equals(jta.getText())) {
 99             jta.append( "接收信息成功!");
100         } else {
101             jta.append("\r\n" + "接收信息成功!");
102         }
103         jta.setEnabled(false);
104         //System.out.println("接收信息成功!");
105         client.close();
106     }
107 }

 

  2 
  3 import java.awt.*;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.io.*;
  7 import java.net.*;
  8 import java.security.Timestamp;
  9 import java.util.*;
 10 import java.util.prefs.BackingStoreException;
 11 
 12 import javax.swing.*;
 13 
 14 public class IServer extends JFrame {
 15     private static long  time1;
 16     private static    long  time2;
 17     private JPanel jp = new JPanel();
 18     private JTextArea jta = new JTextArea();
 19     private JScrollPane jsp = null;
 20     private JButton jb = new JButton("发送");
 21     private JTextField jtf = new JTextField(30);
 22     private ServerSocket server;
 23     private Socket socket;
 24     DataOutputStream dos; 
 25     DataInputStream dis;
 26     public IServer() throws IOException
 27     {
 28         Toolkit t = Toolkit.getDefaultToolkit();
 29         Dimension Size =t.getScreenSize();
 30         int width =  Size.width; 
 31         int height = Size.height;
 32         setLocationByPlatform(true);
 33         jsp = new JScrollPane(jta);
 34         this.setTitle("发送方");
 35         this.setSize(600, 500);
 36         this.setBounds((width - 600) / 2,
 37                 (height - 500) / 2, 600,500);
 38         jp.add(jtf);
 39         jp.add(jb);
 40         this.add(jsp, BorderLayout.CENTER);
 41         this.add(jp, BorderLayout.SOUTH);
 42         jta.setCaretPosition(jta.getDocument().getLength());// 设置滚动条自动滚动
 43         this.setVisible(true);
 44         this.setAlwaysOnTop(true);
 45         server = new ServerSocket(9000);
 46         socket= server.accept();
 47         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 48         dos = new DataOutputStream(socket.getOutputStream());
 49         dis =new DataInputStream(socket.getInputStream());
 50         jb.addActionListener(new ActionListener(){
 51             public void actionPerformed(ActionEvent event){
 52                 try {
 53                     Send();
 54                 } catch (InterruptedException | IOException e) {
 55                     // TODO Auto-generated catch block
 56                     e.printStackTrace();
 57                 }
 58             }
 59         });
 60     }
 61     public static void main(String[] args) throws IOException, InterruptedException
 62     {
 63             new IServer();                                
 64     }
 65     public void Send() throws InterruptedException, IOException
 66     {
 67         String info = jtf.getText();
 68         jtf.setText("");
 69         /*if (jta.getText() == null || "".equals(jta.getText())) {
 70             jta.append("Client:" + info);
 71         } else {
 72             jta.append("\r\nClient:" + info);
 73         }*/
 74 
 75         
 76         ///////////////////////////////////
 77         char[] Msg = info.toCharArray();
 78         dos.write(Msg.length);
 79         for(int i=0;i<Msg.length;i++)
 80         {                                                
 81             Random random=new java.util.Random();                        //实现数据帧错传,以随机数的概率来实现                        
 82             int result=random.nextInt(21);
 83             if(result>=4)
 84             {    
 85                 if (jta.getText() == null || "".equals(jta.getText())) {
 86                     jta.append("Sending...:" + Msg[i]);
 87                 } else {
 88                     jta.append("\r\nSending...:" + Msg[i]);
 89                 }
 90                 dos.writeChar(Msg[i]);                                    //发送数据帧
 91                 time1 = System.currentTimeMillis();                        //设置超时计时器                    
 92             }
 93             else
 94             {    
 95                 if (jta.getText() == null || "".equals(jta.getText())) {
 96                     jta.append("Sending...:" + Msg[i]);
 97                 } else {
 98                     jta.append("\r\nSending...:" + Msg[i]);
 99                 }
100                 dos.writeChar(‘η‘);                                        //发送数据帧
101                 time1 = System.currentTimeMillis();                         //设置超时计时器                                                                   
102             }                    
103             int c = dis.readInt();                                        //接受客户端确认帧
104             time2 = System.currentTimeMillis();
105             long time = time2-time1;
106             //System.out.println("接收所用时间:"+time);
107             if(time<500)                                                        //确认帧未超时
108             {
109                 if(c==i+2)                                                    //确认帧正确,传输成功,准备传输下一个帧
110                 { 
111                     if(i<Msg.length-1)
112                     {
113                         if (jta.getText() == null || "".equals(jta.getText())) {
114                             jta.append("Receive:" + c);
115                         } else {
116                             jta.append("\r\nReceive:" + c);
117                         }
118                         //System.out.println("接收方返回帧:"+c+"  第"+(i+1)+"号帧传输成功!");
119                     }
120                     else
121                     {
122                         if (jta.getText() == null || "".equals(jta.getText())) {
123                             jta.append("Receive:" + (i+2)+"数据传输成功!");
124                         } else {
125                             jta.append("\r\nReceive:" + (i+2)+"数据传输成功!");
126                             jta.setEnabled(false);
127                             
128                         }
129                         //System.out.println("第"+(i+1)+"号帧传输成功!");
130                         //System.out.println("数据传输成功!");
131                         server.close();
132                     }        
133                 }
134                 else if(c==-2)                                                        //确认帧出错,超时重传
135                 {
136                     if (jta.getText() == null || "".equals(jta.getText())) {
137                         jta.append("Receive:数据帧出错,丢弃等待....."+
138                                 "确认帧接收超时,重新发送"+(i+1)+"帧");
139                     } else {
140                         jta.append("\r\nReceive:Receive:数据帧出错,丢弃等待....."
141                     +"确认帧接收超时,重新发送"+(i+1)+"帧");
142                     }
143                     //System.out.println("数据帧出错,丢弃等待.....");
144                     Thread.sleep(300);
145                     //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
146                     i=i-1;
147                 }
148             }
149             else//超时,重传
150             {
151                 if (jta.getText() == null || "".equals(jta.getText())) {
152                     jta.append("Receive:" +"确认帧接收超时,重新发送"+(i+1)+"帧");
153                 } else {
154                     jta.append("\r\nReceive:" + "确认帧接收超时,重新发送"+(i+1)+"帧");
155                 }
156                 //System.out.println("确认帧接收超时,重新发送"+(i+1)+"帧");
157                 i=i-1;    
158             }    
159         }
160     }
161 }

 

以上是关于java利用socket通信模拟实现ARQ停止等待协议的主要内容,如果未能解决你的问题,请参考以下文章

TCP可靠传输:ARQ协议(停止等待超时重传滑动窗口回退N帧选择重传)

计算机网络 计算时延利用率吞吐量

计算机网络 计算时延利用率吞吐量

计算机网络 计算时延利用率吞吐量

TCP的几个知识点

Java实现Socket通信