socket通信简易聊天室
实现的功能通信、清屏、记录和窗口震动。
public class GuiChat {
private JTextField jt;
private JButton send;
private JButton log;
private JButton clean;
private JButton shack;
private TextArea ja;
private TextField ja1;
private DatagramSocket socket;
private BufferedWriter bw;
private JFrame frame;
private JLabel sends,receive,bel;
public GuiChat() {
init();
}
public void init() {
frame = new JFrame();
frame.setSize(500, 600);
frame.setLocation(500, 50);
try {
socket = new DatagramSocket();
} catch (SocketException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
new Receive().start();
File f = new File("log.txt");
try {
bw = new BufferedWriter(new FileWriter(f,true));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Panel p = new Panel();
Panel p1 = new Panel();
jt = new JTextField(10);
jt.setText("127.0.0.1");
send = new JButton("发 送");
log = new JButton("记 录");
clean = new JButton("清 除");
shack = new JButton("震 动");
bel = new JLabel("ip地址:");
Panel panel1=new Panel();
panel1.add(new JLabel("当前机器的IP地址是:"));
try {
panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));
} catch (UnknownHostException e) {
panel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));
}
p1.add(panel1);
p1.add(bel);
p1.add(jt);
p.add(send);
p.add(log);
p.add(clean);
p.add(shack);
send.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
send();
}
});
log.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
log();
}
});
clean.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ja.setText("");
}
});
shack.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
send(new byte[] {-1},jt.getText());
}
});
frame.add(p1, BorderLayout.NORTH);
frame.add(p, BorderLayout.SOUTH);
Panel s = new Panel();
Panel p2 = new Panel();
sends = new JLabel("收到的内容:");
receive = new JLabel("发送的内容:");
receive.setFont(new Font("黑体", Font.BOLD, 15));
sends.setFont(new Font("黑体", Font.BOLD, 15));
ja = new TextArea();
ja1 = new TextField(30);
ja1.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_ENTER) {
send();
}
}
});
ja.setEditable(false);
ja.setBackground(Color.WHITE);
ja.setFont(new Font("黑体", Font.BOLD, 20));
ja1.setFont(new Font("黑体", Font.BOLD, 20));
s.setLayout(new BorderLayout());
s.add(sends,BorderLayout.NORTH);
p2.add(receive,BorderLayout.NORTH);
p2.add(ja1, BorderLayout.CENTER);
s.add(ja, BorderLayout.CENTER);
s.add(p2, BorderLayout.SOUTH);
frame.add(s, BorderLayout.CENTER);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
socket.close();
try {
bw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.exit(0);
}
});
frame.setVisible(true);
}
private void shack() {
// TODO Auto-generated method stub
int x = frame.getLocation().x;
int y = frame.getLocation().y;
for (int i = 0; i < 10; i++) {
try {
frame.setLocation(x+20, y+20);
Thread.sleep(20);
frame.setLocation(x+20, y-20);
Thread.sleep(20);
frame.setLocation(x-20, y+20);
Thread.sleep(20);
frame.setLocation(x-20, y-20);
Thread.sleep(20);
frame.setLocation(x, y);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void send(byte[] arr,String ip) {
DatagramPacket packet;
try {
packet = new DatagramPacket(arr,arr.length, InetAddress.getByName(ip),6666);
socket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void send() {
String str = ja1.getText();
String ip = jt.getText();
ip = ip.trim().length()==0?"255.255.255.255":ip;
try {
send(str.getBytes(),ip);
String time = ctime();
String string = time+"我对:"+ip+"说:"+"\r\n"+str+"\r\n\r\n";
ja.append(string);
bw.write(string);
ja1.setText("");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void log() {
try {
bw.flush();
FileInputStream fis = new FileInputStream("log.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len;
byte[] arr = new byte[8129];
while((len=fis.read(arr))!=-1) {
baos.write(arr,0,len);
}
String str = baos.toString();
ja.setText(str);
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(6666);
DatagramPacket packet = new DatagramPacket(new byte[8192], 8192);
while(true) {
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
if(arr[0]==-1&&len==1) {
shack();
continue;
}
String ip = packet.getAddress().getHostName();
String str = new String(arr,0,len);
String time = ctime();
String string = time+" "+ip+"对我说\r\n"+str+"\r\n\r\n";
ja.append(string);
bw.write(string);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String ctime() {
Date data = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(data);
}
public static void main(String[] args) {
new GuiChat();
}
}