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,"雪人一号");
}
}
如有不足之处,请指正