/**引入函数所需的包*/
import java.awt.* ;
import java.awt.Component;
import java.awt.geom.* ;
import java.util.* ;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.geom.Line2D.Double;
import java.beans.*;
import java.io.*;
import javax.swing.filechooser.*;
import javax.swing.filechooser.FileFilter;
import java.net.*;
/**
类名称:QQQ
作用:制作一个简单的QQ聊天程序,可以进行
对话的传输,文件的传输D:/
接收
作者:王书婷
日期:09.10.15*/
class QQQ extends JFrame implements ActionListener,Runnable
{
public QQQ()
{
/**设置三个面板的位置*/
tp.add(p1,"GBN");
add(tp);
tp.setBackground(Color.cyan);
p1.setLayout(new GridLayout(2,1));
p1.add(p2);
p2.setLayout(new BorderLayout());
JScrollPane sp2 = new JScrollPane(ta2);
p2.add(p3,BorderLayout.NORTH);
p2.add(sp2,BorderLayout.CENTER);
p2.add(p4,BorderLayout.SOUTH);
p4.add(b3);
b3.setMnemonic(KeyEvent.VK_ENTER);
setTitle("GBN");
setSize(300, 600);
/**添加事件监听器*/
b3.addActionListener(this);
Thread t = new Thread(this);
t.start();
}
public void actionPerformed(ActionEvent e)
{
System.out.println("Sending is running");
/**如果获取的事件是按钮事件*/
if((e.getSource())instanceof JButton)
{
/**当用户按下的为发送按钮*/
sendText = ta2.getText();
if (sendText.equals(""))
{
JOptionPane.showMessageDialog(null,"发送的消息不能为空");
}
else//开始传输分组,设置窗口大小为三
{
int text_length = sendText.length();
while(win_free>0&&flag<=sendText.length())
{
send_char = sendText.substring(flag-1,flag)+flag;//每次将一个字符封装进一个数据包发送
try
{
DatagramSocket dss = new DatagramSocket();
byte[] bSend = send_char.getBytes();
DatagramPacket dps = new DatagramPacket (bSend,bSend.length,
InetAddress.getByName(desAddress),idesTalkingPort);
dss.send(dps);
flag ++ ;
i++;
win_free -- ;
}
catch(Exception ex1)
{
ex1.printStackTrace();
}
}
b3.setEnabled(false);
flag -- ;
i=0;
complete = 0 ;
set = 0 ;
}
}
}
public void run()//线程用于监听应答信息的到来
{
try
{
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
DatagramSocket ds = null;
try
{
ds = new DatagramSocket(iownSurePort);
}
catch(Exception ex5)
{
ex5.printStackTrace();
}
while(true)
{
ds.receive(dp);
this.dp = dp;
answer = new String(buf,0,dp.getLength());//接收应答
recieve_flag = Integer.parseInt(answer.substring(1,2));//截取分组的编号
if(answer.substring(0,1).equals("A"))
{
JOptionPane.showMessageDialog(null,"成功发送"+sendText.substring(recieve_flag-1,recieve_flag));
if(set==0)
{
win_free++;
}
System.out.println("win_free "+win_free);
if(recieve_flag==sendText.length()&&complete == 0) //若当次流水线传输都成功,且已发送完毕,则标志结束
{
ta2.setText(null);
complete = 0 ;
JOptionPane.showMessageDialog(null,"发送完毕");
recieve_flag = 0 ;
}
}
else if(answer.substring(0,1).equals("N")&&complete == 0)//若当次流水线传输都成功,且已发送完毕,则标志结束
{
JOptionPane.showMessageDialog(null,"丢弃"+sendText.substring(recieve_flag-1,recieve_flag));
if(set==0)
win_free++;
System.out.println("win_free "+win_free);
if(recieve_flag==sendText.length())
{
ta2.setText(null);
complete = 0 ;
recieve_flag = 0 ;
JOptionPane.showMessageDialog(null,"发送完毕");
}
}
else
{
answer = new String(buf,0,dp.getLength());
set = 1 ;
if(flag > recieve_flag)
{
flag = recieve_flag ;
complete = 1 ;
}
System.out.println("win_free "+win_free);
JOptionPane.showMessageDialog(null,"超时发送"+sendText.substring(recieve_flag-1,recieve_flag)+"请重发");
}
if(win_free>0)
{
b3.setEnabled(true);
}
}
}
catch(Exception ex1)
{
ex1.printStackTrace();
}
}
private JPanel p1 = new JPanel();
private JPanel p2 = new JPanel();
private JPanel p3 = new JPanel();
private JPanel p4 = new JPanel();
private JButton b3 = new JButton("发送");
/**定义文本域*/
private JTextArea ta2 = new JTextArea();
private JTabbedPane tp = new JTabbedPane();
private JTextField Dialogtf1 = new JTextField(10);
private JTextField Dialogtf2 = new JTextField(10);
private JTextField Dialogtf3 = new JTextField(10);
private JTextField Dialogtf4 = new JTextField(10);
private JTextField Dialogtf5 = new JTextField(10);
private DatagramPacket dp ;
int flag = 1 ;//发送的分组的下标(从1开始计算)
int recieved_num=0 ;//接到的分组数
private String send_char = new String();//每次发送的字符
int idesTalkingPort = 7777;//为接收方接收数据的目的端口
int iownFilePort=6666;//为发送方发送数据的源端口
int iownSurePort =7788;//为发送方接收确认的端口
String desAddress ="127.0.0.1";//目标地址
byte[] b = new byte[64];
String answer = new String() ;//收到的分组
int win_length= 3 ;//窗口大小
int recieve_flag = 0;//收到确认中的分组标号
String sendText ;//发送文本的内容
int i = 0 ;//计数器,用户控制传输分组数
int complete = 0 ;//表示该次分组传输是够都成功,为0是,为1否
int set = 0 ;
int win_free = 3 ;
}
public class Send
{
public static void main(String[] args)
{
QQQ qq = new QQQ();
qq.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
qq.setVisible(true);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
gbn协议模拟带图形界面
共9个文件
class:5个
bak:2个
java:2个
4星 · 超过85%的资源 需积分: 10 55 下载量 186 浏览量
2010-04-26
17:04:38
上传
评论
收藏 14KB RAR 举报
温馨提示
带图形界面的gbn协议模拟,通过按钮是否可按显示窗口的剩余数目,人工操控丢包超时
资源推荐
资源详情
资源评论
收起资源包目录
gbn正式注释版.rar (9个子文件)
gbn正式注释版
Send.java.bak 6KB
QQQ$1.class 1KB
QQQ.class 5KB
QQ.class 367B
Recieve.class 377B
Recieve.java.bak 5KB
Recieve.java 5KB
Send.java 6KB
Send.class 371B
共 9 条
- 1
资源评论
- keweyt2012-11-21不太会运行啊,程序应该是没错
- futurecreator2012-11-29挺不错的东西,有些帮助
- fly600002012-11-25无法运行呀!
- czqcamellia2013-01-04不知道怎么运行
qqqqwwwweeeewdmy
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功