1、先看程序运行结果:
看起来还不错是吧,很适合用来传情书~
2、接下来看代码:
(1)、数据包的接收处理+发送处理+图形交互处理类
package test09;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class DatagramPacketWindow extends JFrame implements ActionListener{
//private static final ActionListener event = null;
JTextField sendMessage = new JTextField(6);//信息框
JTextArea receiveMessage = new JTextArea();//文本显示区
JButton sendButton = new JButton("发送");
SendDataPacket sendDataPacket;//负责发送数据包
ReceiveDatagramPacket receiveDatagramPacket;//负责接收数据包
DatagramPacketWindow()
{
sendDataPacket = new SendDataPacket();
receiveDatagramPacket = new ReceiveDatagramPacket();
receiveDatagramPacket.setJTextArea(receiveMessage);
setSize(400,200);
setVisible(true);
JPanel pSouth = new JPanel();
pSouth.add(sendMessage);
pSouth.add(sendButton);
add(pSouth,"South");
add(new JScrollPane(receiveMessage),"Center");
validate();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
sendButton.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
byte buffer[] = sendMessage.getText().trim().getBytes();
sendDataPacket.setmessBySend(buffer);
sendDataPacket.sendMess();
}
}
(2)、数据包的发送类
package test09;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDataPacket {
public byte messBysend[];//存放要发送的数据
public String IP;//目标IP地址
public int port;//目标端口
public void setPort(int port)
{
this.port = port;
}
public void setIP(String IP)
{
this.IP = IP;
}
public void setmessBySend(byte messBySend[])
{
this.messBysend = messBySend;
}
public void sendMess()
{
try {
InetAddress address = InetAddress.getByName(IP);
DatagramPacket dataPack =
new DatagramPacket(messBysend,messBysend.length,address,port);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(dataPack);//发送数据包
}catch(Exception e) {}
}
}
(3)、数据包的接收类
package test09;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import javax.swing.*;
public class ReceiveDatagramPacket implements Runnable {
JTextArea receiveMess;//文本区存放信息
Thread thread;
public int port;//接收信息的端口
public ReceiveDatagramPacket()
{
thread = new Thread(this);
}
public void setJTextArea(JTextArea text)
{
receiveMess = text;
}
public void setPort(int port)
{
this.port = port;
}
public void receiveMess()
{
thread.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
DatagramPacket pack = null;
DatagramSocket datagrameSocket = null;
byte data[] = new byte[8192];
try {
pack = new DatagramPacket(data,data.length);
datagrameSocket = new DatagramSocket(port);
}catch(Exception e) {}
if(datagrameSocket == null) return;
while(true)
{
try {
datagrameSocket.receive(pack);
String message = new String(pack.getData(),0,pack.getLength());
receiveMess.append("\n"+message);
System.out.println(message);
}catch(Exception e) {}
}
}
}
(4)、第一个用户类
package test09;
public class Window01 extends DatagramPacketWindow{
Window01()
{
setTitle("钱:");
sendDataPacket.setIP("10.3.63.213");
sendDataPacket.setPort(666);
receiveDatagramPacket.setPort(888);
receiveDatagramPacket.receiveMess();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Window01 win_1 = new Window01();
}
}
(5)、第二个用户类
package test09;
public class Window02 extends DatagramPacketWindow{
Window02()
{
setTitle("杨:");
sendDataPacket.setIP("10.3.63.213");
sendDataPacket.setPort(888);
receiveDatagramPacket.setPort(666);
receiveDatagramPacket.receiveMess();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Window02 win_2 = new Window02();
}
}
3、再来看原理:
代码有点小多哈,但是道理还是很好理解滴~
(1)、什么是UDP?
(2)、TCP与UDP的区别?
详:TCP和UDP的区别 - 知乎 (zhihu.com)//一文搞懂TCP与UDP的区别 - Fundebug - 博客园 (cnblogs.com)
略:上一篇的TCP的通信方式类似于一个人在打电话(客户端),一个人在等待接听(服务器),实现这种方式要先进行建立连接,这个过程有时会比较慢;而UDP类似于现实生活中发邮件,将数据打包发到另一端,另一端再接收数据包,再查看数据包中的内容。UDP的传输速度较快,但不提供可靠性。
(3)、部分重要代码:
发送数据包的创建:
InetAddress address = InetAddress.getByName(IP);
DatagramPacket dataPack =
new DatagramPacket(messBysend,messBysend.length,address,port);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(dataPack);//发送数据包
接收数据包的创建与功能实现:
public void run() {
// TODO Auto-generated method stub
DatagramPacket pack = null;
DatagramSocket datagrameSocket = null;
byte data[] = new byte[8192];
try {
pack = new DatagramPacket(data,data.length);
datagrameSocket = new DatagramSocket(port);
}catch(Exception e) {}
if(datagrameSocket == null) return;
while(true)
{
try {
datagrameSocket.receive(pack);
String message = new String(pack.getData(),0,pack.getLength());
receiveMess.append("\n"+message);
System.out.println(message);
}catch(Exception e) {}
}