JAVA网络编程练习--基于UDP的数据报的通信过程--实现“邮件”的传递

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?

UDP协议 是什么?_百度知道 (baidu.com)

(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) {}
		}

Guess you like

Origin blog.csdn.net/qq_51701007/article/details/121241354