UDP通信

1、实现效果:

 

2、UDP协议

UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

3、UDP通信的实现

3、1相关类:

主要为DatagramSocket和DatagramPacket类

DatagramSocket类用于表示发送和接收数据包的套接字,而DatagramPacket类用来表示数据包

简单的来说:DatagramSocket用来发送和接受数据的,DatagramPacket是用来表示数据的

3、2相关方法

构造方法:

DatagramSocket类的构造方法:DatagramSocket()和DatagramSocket(int post)

1、DatagramSocket()不绑定端口,构造数据报套接字并将其绑定到本地主机上任何可用的端口

2、DatagramSocket(int post)绑定端口,构造数据报套接字并将其绑定到本地主机上的指定端口

区别:

如果想让别人给自己发信息的话,对方必须知道自己的ip和端口号,此时应该使用绑定端口的DatagramSocket。

如果别人给自己发信息,对方使用不绑定端口的DatagramSocket也行的。

DatagramPacket类的构造方法:

1、DatagramPacket(byte[] buf, int length),用于接受数据,数据接收在buf数组中,length为buf的长度

2、DatagramPacket(byte[] buf, int length , InetAddress address , int port),用于发送数据,buf为发送的数据,length为buf的长度,必须指明接受方的地址和端口

非构造方法:

DatagramSocket的send(DatagramPacket p)和receive(DatagramPacket p)方法

1、send(DatagramPacket p)方法中的p对象,必须必须指明接受方的地址和端口,即使用第二种DatagramPacket构造方法

2、receive(DatagramPacket p)方法中的p对象,使用第一种DatagramPacket构造方法

 

3、3简单的UDP通信程序

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendGet {
	int getPost;
	int sendPost;
	DatagramSocket Socket;
	DatagramPacket Packet;
	byte []b;
	//get为接受端口,send为发送端口
	public SendGet(int get,int send) {
		try {
			getPost=get;
			sendPost=send;
			Socket=new DatagramSocket(getPost);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//发送数据
	public void sendStr(String str) {
		try {
			b=str.getBytes();
			Packet = new DatagramPacket(b, b.length,InetAddress.getLocalHost(),sendPost);
			Socket.send(Packet);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		
		
	}
	//接受数据
	public String getStr() {
		b=new byte[1024];
		Packet=new DatagramPacket(b,b.length);
		try {
			Socket.receive(Packet);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return new String(b);
	}
}

到这里,udp程序基本完成。以下是相关的GUI代码和udp启动代码

GUI界面


import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.TextArea;
import java.awt.TextField;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Win extends JFrame{
	JPanel jp=new JPanel();
	TextField ip=new TextField(10);
	TextField in=new TextField(20);
	TextArea  ta=new TextArea(14,18);
	Button bu=new Button("发送");
	Button clear=new Button("清屏");
	String name;
	public Win(String name) {
		
		//设置窗口
		this.setTitle("你正在与"+name+"聊天");
		this.setBounds(200, 200, 480, 300);		
		//设置ip栏
		ip.setEditable(false);	
		ip.setBackground(Color.white);
		try {
			ip.setText(InetAddress.getLocalHost().getHostAddress().toString());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		
		//设置聊天窗口
		ta.setEditable(false);
		ta.setBackground(Color.white);
		
		//设置发送栏
		jp.add(ip,BorderLayout.WEST);
		jp.add(in,BorderLayout.CENTER);
		jp.add(bu,BorderLayout.EAST);
		jp.add(clear,BorderLayout.EAST);
		
		//设置整体布局
		this.setLayout(new BorderLayout());
		this.add(ta,BorderLayout.CENTER);
		this.add(jp,BorderLayout.SOUTH);
		
		
		this.setVisible(true);
		this.setResizable(false);	
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

GUI和UDP结合类


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class UDP  implements Runnable,ActionListener{
	Thread th;
	SendGet operate;
	String name;		
	Win win;	
	//初始化
	public UDP(int gpost,int spost,String name) {
		operate=new SendGet(gpost, spost);
		win=new Win(name);
		this.name=name;
		th=new Thread(this);
		th.start();
	}
	
	public void run() {
		//监听按钮
		win.bu.addActionListener(this);
		win.clear.addActionListener(this);
		//输出信息
		while(true)
		{
			win.ta.append(msg(1)+operate.getStr());
			win.ta.append("\n");
		}
		
	}
	
	//按钮操作
	public void actionPerformed(ActionEvent e) {
		//清屏操作
		if(e.getSource()==win.clear)
			win.ta.setText("");
		else if(e.getSource()==win.bu)
		{
			//发送操作
			String str=win.in.getText();
			win.ta.append(msg(2)+str);
			win.ta.append("\n");
			win.in.setText("");
			operate.sendStr(str);
			
		}
	}
	//返回时间信息
	public String msg(int flag)
	{
		Calendar c=Calendar.getInstance();
		Date d=c.getTime();
		if(flag==1)
			return new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss").format(d)+"   "+name+" \n"+"   ";
		else
			return new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss").format(d)+"   自己  \n"+"   ";
	}
}

测试程序

public class Temp {

	public static void main(String[] args) {
		new UDP(9999,10000,"雪人三号");
		new UDP(10000,9999,"雪人一号");
	}

}

如有不足之处,请指正
 

 

 

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值