客户端代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
public class speak extends JFrame implements Runnable{
JPanel pan=null;
JLabel jl=null;
JLabel jl1=null;
Font f=new Font("微软雅黑",Font.BOLD,15);
JTextArea textarea=null;
JTextArea textarea1=null;
JScrollPane span=null;
JScrollPane span1=null;
JButton b1,b2,b3,b4;
JLabel l1,l2,l3;
JTextField jt1;
JLabel jt2,jt3;
boolean stat,runstat=false;
ServerSocket server;
Socket sock,sock1;
Thread thread,thread1;
PrintWriter out;
BufferedReader in=null;
InetAddress address=null;
speak(){
setSize(480,380);
setTitle("聊天啦!");
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception e) {
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension d=Toolkit.getDefaultToolkit().getScreenSize();
setLocation((d.width-getSize().width)/2,
(d.height-getSize().height)/2);
setContentPane(getpan());
setResizable(false);
setVisible(true);
}
public final JPanel getpan(){
if(pan==null){
pan=new JPanel();
pan.setLayout(null);
jl=new JLabel("聊天记录>>>");
jl.setBounds(20,0,140,20);
jl.setFont(f);
pan.add(jl);
jl1=new JLabel("发送消息>>>");
jl1.setBounds(20,220,140,20);
jl1.setFont(f);
pan.add(jl1);
l1=new JLabel("IP地址:");
l1.setBounds(360,10,120,20);
l1.setFont(f);
pan.add(l1);
l2=new JLabel("连接状态:");
l2.setBounds(360,175,120,20);
l2.setFont(f);
pan.add(l2);
l3=new JLabel("本机IP地址:");
l3.setBounds(360,135,120,20);
l3.setFont(f);
pan.add(l3);
pan.add(getarea());
pan.add(getspan());
pan.add(getarea1());
pan.add(getspan1());
pan.add(getb1());
pan.add(getb2());
pan.add(getb3());
pan.add(getb4());
pan.add(getjt1());
pan.add(getjt2());
pan.add(getjt3());
}
return pan;
}
public JButton getb1(){
if(b1==null){
b1=new JButton("开始连接");
b1.setFont(f);
b1.setBounds(360,60,100,30);
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(runstat){
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(pan,"请先断开连接",
"警告!",JOptionPane.ERROR_MESSAGE);
}
else{
serverListen();
startConnect();
}
}
});
}
return b1;
}
public void serverListen(){
try{
server = new ServerSocket(30000,5);
sock1=server.accept();
in=new BufferedReader(new InputStreamReader(sock1.getInputStream()));
out=new PrintWriter(sock1.getOutputStream());
runstat=true;
jt3.setText("连接成功!");
}
catch(Exception exception){
jt3.setText("连接失败!");
}
thread1=new Thread(this);
thread1.start();
}
public void startConnect(){
try{
sock=new Socket(jt1.getText(),30000);
jt3.setText("连接成功!");
setTitle("与["+jt1.getText()+"]聊天中>>>");
textarea.append("\n");
// textarea.setForeground(Color.green);
textarea.append("连接成功!");
textarea.setSelectionStart(textarea.getText().length());
runstat=true;
in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
out=new PrintWriter(sock.getOutputStream());
}
catch(Exception e){
jt3.setText("连接失败!");
textarea.append("\n");
textarea.append("连接失败!");
textarea.setSelectionStart(textarea.getText().length());
runstat=false;
repaint();
}
thread=new Thread(this);
thread.start();
}
public JButton getb2(){
if(b2==null){
b2=new JButton("断开连接");
b2.setFont(f);
b2.setBounds(360,95,100,30);
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(runstat==false){
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(pan,"未连接!",
"警告!",JOptionPane.ERROR_MESSAGE);
}
else{
try{
out.println("断开连接!");
out.flush();
textarea.append("\n");
textarea.append("断开连接!");
textarea.setSelectionStart(textarea.getText().length());
jt3.setText("断开连接!");
stoprun();
}
catch(Exception e1){
jt3.setText("连接失败!");
textarea.append("\n");
textarea.append("连接失败!");
textarea.setSelectionStart(textarea.getText().length());
}
}
}
});
}
return b2;
}
public JButton getb3(){
if(b3==null){
b3=new JButton("发送");
b3.setFont(f);
b3.setBounds(370,250,80,30);
b3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(textarea1.getText().equals("")){
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(pan,"输入内容为空!",
"警告!",JOptionPane.ERROR_MESSAGE);
}
else if(runstat==true){
sendmsg();
textarea1.setText("");
}
else{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(pan,"未连接!",
"警告!",JOptionPane.ERROR_MESSAGE);
}
}
});
}
return b3;
}
public JButton getb4(){
if(b4==null){
b4=new JButton("取消");
b4.setFont(f);
b4.setBounds(370,290,80,30);
b4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultToolkit().beep();
int i=JOptionPane.showConfirmDialog(pan,"退出程序",
"消息",JOptionPane.OK_CANCEL_OPTION);
if(i==0){
System.exit(0);
}
}
});
}
return b4;
}
public JTextField getjt1(){
if(jt1==null){
jt1=new JTextField("117.132.65.154");
jt1.setBounds(360,30,100,20);
}
return jt1;
}
public JLabel getjt2(){
if(jt2==null){
jt2=new JLabel();
jt2.setBounds(360,155,100,20);
try {
address=InetAddress.getLocalHost();
jt2.setText(address.getHostAddress());
}
catch (UnknownHostException ex) {}
}
return jt2;
}
public JLabel getjt3(){
if(jt3==null){
jt3=new JLabel("准备就绪");
jt3.setFont(new Font("微软雅黑",Font.PLAIN,14));
jt3.setBounds(360,195,100,20);
}
return jt3;
}
public JTextArea getarea(){
if(textarea==null){
textarea=new JTextArea();
textarea.setFont(new Font("微软雅黑",Font.PLAIN,14));
}
return textarea;
}
public JTextArea getarea1(){
if(textarea1==null){
textarea1=new JTextArea();
textarea1.setFont(new Font("微软雅黑",Font.PLAIN,14));
textarea1.addKeyListener(new KeyListener(){
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER){
if(textarea1.getText().equals("")){
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(pan,"输入内容为空!",
"警告!",JOptionPane.ERROR_MESSAGE);
}
else if(runstat==true){
sendmsg();
textarea1.setText("");
}
else{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(pan,"未连接!",
"警告!",JOptionPane.ERROR_MESSAGE);
}
}
}
public void keyReleased(KeyEvent e) {}
});
}
return textarea1;
}
public JScrollPane getspan(){
if(span==null){
span=new JScrollPane(getarea());
span.setBounds(10,20,340,200);
}
return span;
}
public JScrollPane getspan1(){
if(span1==null){
span1=new JScrollPane(getarea1());
span1.setBounds(10,240,340,100);
}
return span1;
}
public void stoprun(){
stat=false;
runstat=false;
}
public void sendmsg(){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str =(df.format(new Date()));
out.println(textarea1.getText());
try {
address = InetAddress.getLocalHost();
} catch (UnknownHostException ex) {}
textarea.setForeground(Color.green);
writemsg("<"+address.getHostName()+
"> "+str+"\n"+textarea1.getText());
// textarea.setForeground(Color.BLACK);
out.flush();
}
public void writemsg(String msg){
textarea.append("\n");
textarea.append(msg);
textarea.setSelectionStart(textarea.getText().length());
}
public static void main(String[] args) {
speak speak = new speak();
}
public void run() {
stat=true;
String msg;
while(stat){
try {
msg = in.readLine();
if(msg.equals("连接失败!")||msg.equals("断开连接!")){
writemsg(msg);
stoprun();
}
else if(msg!=null){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str=(df.format(new Date()));
Toolkit.getDefaultToolkit().beep();
writemsg("<"+jt1.getText()+"> "+str+"\n"+msg);
}
}
catch (IOException ex){}
}
try{
jt3.setText("断开连接!");
textarea.append("\n");
textarea.append("断开连接!");
textarea.setSelectionStart(textarea.getText().length());
sock.close();
server.close();
in.close();
out.close();
sock=null;
server=null;
runstat=false;
}
catch(IOException ie){}
}
}