界面:
package com.lovo.socketgui;
import java.awt.Color;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class FlySpringFrame extends JFrame {
private static Properties props;
private Container contentP;
private JScrollPane scorollP;
private JTextArea msgAre;
private JTextField inputTxt;
private JButton sendBtn;
private JComboBox ipCom;
private JButton clearBtn;
private JCheckBox autoBackChoice;
private JTextField autoBackTxt;
private ServerSocket ss;
static {
props = new Properties();
try {
props.load(new FileInputStream("name1.properties"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public FlySpringFrame() {
Toolkit tk = Toolkit.getDefaultToolkit();
this.setTitle("我的飞春");
// 设置窗体位置
this.setLocation(((int) tk.getScreenSize().getWidth() - 500) / 2,
((int) tk.getScreenSize().getHeight() - 400) / 2);
// 设置窗体大小
this.setSize(500, 400);
// 设置窗体大小不可变
this.setResizable(false);
// 设置关闭
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addContent();
this.setVisible(true);
// 服务器监听
try {
ss = new ServerSocket(9527);
while (true) {
Socket socket = ss.accept();
new ProcessThread(socket, this.msgAre, this.autoBackChoice,
this.autoBackTxt).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void addContent() {
// TODO Auto-generated method stub
this.contentP = this.getContentPane();
this.contentP.setBackground(Color.WHITE);
this.contentP.setLayout(null);
this.msgAre = new JTextArea();
this.scorollP = new JScrollPane(this.msgAre);
this.scorollP.setBounds(20, 20, 460, 250);
this.contentP.add(this.scorollP);
this.msgAre.setEditable(false);
this.inputTxt = new JTextField();
this.inputTxt.setBounds(20, 300, 200, 30);
this.contentP.add(this.inputTxt);
this.sendBtn = new JButton("发送");
this.sendBtn.setBounds(240, 300, 60, 30);
this.contentP.add(this.sendBtn);
this.sendBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String input = inputTxt.getText();
inputTxt.setText("");
if (input == null || input.trim().equals("")) {
JOptionPane.showMessageDialog(contentP, "不能发送空消息");
} else {
input = "胡老师&" + input;
Socket sendSocket = null;
try {
String name = ipCom.getSelectedItem().toString();
String ip = props.getProperty(name);
if (ip == null || ip.equals("")) {
ip = name;
}
if (!ip.matches("(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])")) {
input = "友情提示&请输入有效的IP地址或在好友列表中选择好友";
ipCom.setSelectedIndex(0);
} else {
sendSocket = new Socket(ip, 9527);
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(sendSocket
.getOutputStream()));
bw.write(input);
bw.flush();
}
msgAre.append(input.split("&")[0] + "说:"
+ input.split("&")[1] + "\n");
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
if (sendSocket != null) {
try {
sendSocket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}
});
Set allKey = props.keySet();
Object[] allNames = allKey.toArray();
this.ipCom = new JComboBox(allNames);
this.ipCom.setBounds(320, 300, 100, 30);
this.ipCom.setEditable(true);
this.contentP.add(this.ipCom);
this.clearBtn = new JButton("清屏");
this.clearBtn.setBounds(430, 300, 60, 30);
this.contentP.add(this.clearBtn);
this.clearBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
msgAre.setText("");
}
});
this.autoBackChoice = new JCheckBox("自动回复");
this.autoBackChoice.setBounds(20, 340, 80, 30);
this.autoBackChoice.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (autoBackChoice.isSelected()) {
autoBackTxt.setEditable(true);
} else {
autoBackTxt.setEditable(false);
}
}
});
this.contentP.add(this.autoBackChoice);
this.autoBackTxt = new JTextField("我不在,请稍后联系");
this.autoBackTxt.setBounds(120, 340, 200, 30);
this.autoBackTxt.setEditable(false);
this.contentP.add(this.autoBackTxt);
}
}
线程:
package com.lovo.socketgui;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JCheckBox;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ProcessThread extends Thread {
private Socket socket;
private JTextArea msgArea;
private JCheckBox autoBackChoice;
private JTextField autoBackTxt;
public ProcessThread(Socket socket, JTextArea msgArea,JCheckBox autoBackChoice,JTextField autoBackTxt) {
this.socket = socket;
this.msgArea = msgArea;
this.autoBackChoice = autoBackChoice;
this.autoBackTxt = autoBackTxt;
}
public void run() {
BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String msg = br.readLine();
String[] allMsg = msg.split("&");
msgArea.append(allMsg[0] + "("
+ socket.getInetAddress().getHostAddress() + "):"
+ allMsg[1] + "\n");
msgArea.setCaretPosition(msgArea.getText().length());// 自动跳到最后位置
// 自动回复
if(this.autoBackChoice.isSelected()){
this.autoReturn();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void autoReturn() {
// int num = (int) (Math.random() * 3) + 1;
// String backMsg = "";
// switch (num) {
// case 1:
// backMsg = "胡老师&你好,我正在忙,请稍后再联系!";
// break;
// case 2:
// backMsg = "胡老师&真的是你吗?";
// break;
// case 3:
// backMsg = "胡老师&好的,我知道了!";
// }
String backMsg = this.autoBackTxt.getText();
if(backMsg.trim().equals("")){
backMsg = "我不在,请稍后联系";
}
backMsg = "胡老师&" + backMsg;
String address = this.socket.getInetAddress().getHostAddress();
if (!address.equals("127.0.0.1")) {
Socket sendSocket = null;
try {
sendSocket = new Socket(address, 9527);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
sendSocket.getOutputStream()));
bw.write(backMsg);
bw.flush();
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
try {
sendSocket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}
测试:
package com.lovo.test;
import com.lovo.socketgui.FlySpringFrame;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
new FlySpringFrame();
// String regex = "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))";
// String ip = JOptionPane.showInputDialog("");
// if(ip.matches(regex)){
// JOptionPane.showMessageDialog(null, "Success");
// }else{
// JOptionPane.showMessageDialog(null, "Failed");
// }
}
}