一.时间类
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();
}
}