Java基础20-UDP

一.时间类
 1.Date
  a.什么是Date
   代表一个精确到毫秒的瞬间, 通常用来显示时间
  b.使用方式
   System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
 
 2.Calendar
  a.什么是Calendar
   代表日历, 精确到毫秒. 可以获取, 设置, 增减某个字段.
  b.使用方式
   get(int)  get(Calendar.Date)就是获取当前是几号
   set(int, int) set(Calendar.YEAR, 2008) 设置年份为2008年
   add(int, int)   add(Calendar.Date, 10) 将日历向后翻10天
   getTime()  将Calendar转换为Date
   
二.UDP传输
 1.发送端
  创建DatagramSocket, 可以使用无参构造函数, 绑定随机端口
  创建DatagramPacket, 4个参数, 数据, 长度, 地址, 端口
  使用DatagramSocket的send方法发送DatagramPacket
  关闭DatagramSocket, 释放资源
  
 2.接收端
  创建DatagramSocket, 必须指定端口
  创建DatagramPacket, 2个参数, 用来接收数据的数组, 长度
  使用DatagramSocket的receive方法接收DatagramPacket
  关闭DatagramSocket, 释放资源
  从DatagramPacket中获取数据, getData(), getLength(), getAddress(), getPort()

 

三.简易聊天室

源代码:

package cn.base23.udp;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.locks.ReentrantLock;

/*
 * UDP网络聊天室:
 * 	
 */
public class MyUdpChat implements Runnable{

	private Frame frame;
	private TextArea textAll;
	private TextArea textMy;
	private Panel panelDown;
	private Panel panelUp;
	private TextField textIP;
	private Button sendBtn;
	private Button clsBtn;
	private Button logBtn;
	private Button shakeBtn;
	private ReentrantLock lock = new ReentrantLock();
	
	private MyUdpChat() {
		generateUI();
		handleEvent();
	}
	
	private void generateUI() {
		frame = new Frame("我们的天地");
		frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-350)/2, (Toolkit.getDefaultToolkit().getScreenSize().height-600)/2);
		frame.setSize(350, 600);
		frame.setMinimumSize(new Dimension(400,600));
		
		textAll = new TextArea();			
		textMy = new TextArea(4,100);			//边界布局,列是无效的
		panelDown = new Panel();
		panelUp = new Panel();
		textIP = new TextField(20);
		sendBtn = new Button("发送");
		clsBtn = new Button("清屏");
		logBtn = new Button("聊天记录");
		shakeBtn = new Button("震动");
		
		panelDown.add(textIP);
		panelDown.add(sendBtn);
		panelDown.add(clsBtn);
		panelDown.add(logBtn);
		panelDown.add(shakeBtn);
		
		textAll.setEditable(false);
		textAll.setBackground(Color.WHITE);
		textIP.setText("127.0.0.1");
		panelUp.setLayout(new BorderLayout());
		panelUp.add(textAll, BorderLayout.CENTER);
		panelUp.add(textMy, BorderLayout.SOUTH);
		
		frame.add(panelUp, BorderLayout.CENTER);
		frame.add(panelDown, BorderLayout.SOUTH);
		frame.setVisible(true);
	}
	
	private void handleEvent() {
		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				addToLog();
				System.exit(0);
			}
		});
		
		sendBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				sendMessage();
			}
			
		});
		
		clsBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				lock.lock();
				addToLog();
				lock.unlock();
				textAll.setText(null);
			}
			
		});
		
		logBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				lock.lock();
				addToLog();
				loadLog();
				lock.unlock();
			}
			
		});
		
		shakeBtn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				doShark();				
			}
			
		});
		
		textMy.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER) {
					sendMessage();
					e.consume();				//取消按快捷键事件的造成的输入
				}
			}
		});
	}
	
	private void doShark() {
		String ip = textIP.getText();
		byte[] b = new byte[]{-1};
		DatagramSocket socket =null;
		try {
			socket = new DatagramSocket();
			DatagramPacket packet = new DatagramPacket(b, b.length, InetAddress.getByName(ip.length()==0? "255.255.255.255": ip), 8888);
			socket.send(packet);
		} catch (UnknownHostException e) {
			throw new RuntimeException(e);
		} catch (SocketException e) {	
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			if(socket!= null) 
				socket.close();
		}
	}

	private void shakeWindow() {
		
		try {
			frame.setLocation(frame.getLocation().x-20, frame.getLocation().y-20);
			Thread.sleep(100);
			frame.setLocation(frame.getLocation().x+20, frame.getLocation().y+20);
			Thread.sleep(100);
			frame.setLocation(frame.getLocation().x+20, frame.getLocation().y-20);
			Thread.sleep(100);
			frame.setLocation(frame.getLocation().x-20, frame.getLocation().y+20);
			Thread.sleep(100);			
		} catch (InterruptedException e) {
			throw new RuntimeException(e);
		}
		
	}

	protected void loadLog() {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader("MyChar_LOG.txt"));
			String line=null;		
			while((line= br.readLine())!= null) {
				textAll.append(line+"\r\n");
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {		
			try {
				if(br != null)
					br.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
	}

	private void addToLog() {
		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(new FileWriter("MyChar_LOG.txt",true));
			bw.write(textAll.getText());

		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {		
			try {
				if(bw != null)
					bw.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
		
	}

	private void sendMessage() {
		
		DatagramSocket socket = null;	
		DatagramPacket packet = null;
		try {
			socket = new DatagramSocket();			
			String line = textMy.getText();
			byte[] data = line.getBytes();
			String ip = textIP.getText();
			String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

			ip = (ip==null || ip.length()==0) ? "255.255.255.255": ip.trim();		
			packet = new DatagramPacket(data, data.length, InetAddress.getByName(ip),8888);	
			ip = ip.equals("255.255.255.255") ? "所有人" : ip;
			textAll.append("<你> 对 <"+ ip + "> 说: (" + time +")\r\n" + line +"\r\n\r\n");
			lock.lock();
			socket.send(packet);	
			textMy.setText(null);
			lock.unlock();	
		
		} catch (SocketException e) {
			throw new RuntimeException(e);
		} catch (UnknownHostException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			if(socket != null)
				socket.close();
		}
		
	}

	@Override
	public void run() {
	
		DatagramSocket socket = null;
		DatagramPacket packet = null;
		try {

			socket = new DatagramSocket(8888);
			byte[] data = new byte[1024];
			packet = new DatagramPacket(data, data.length);
			
			while(true) {						
				socket.receive(packet);				
				InetAddress senderAdd = packet.getAddress();
				String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
				if(packet.getLength()==1 && packet.getData()[0]==-1) {
					String s ="<"+ senderAdd.getHostAddress()+"("+ senderAdd.getHostName() +")> " +"对 <你> 使用了震动技能! (" + time +")\r\n\r\n";	
					
					shakeWindow();
					textAll.append(s);
					continue;
				}				
				String s ="<"+ senderAdd.getHostAddress()+"("+ senderAdd.getHostName() +")> " +"对 <你> 说: (" + time +")\r\n";							
				byte[] d = packet.getData();
				int length = packet.getLength();					
				lock.lock();
				textAll.append(s+ new String(d, 0, length)+"\r\n\r\n");
				lock.unlock();
			}				
			
		} catch (SocketException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			if(socket != null) 
				socket.close();
		}
	}
	
	public static void main(String[] args) {
		new Thread(new MyUdpChat()).start();		
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值