1..................................................................
package xiaowen.gui.chat03;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class LoginFrame extends JFrame {
private JLabel jl;
private JButton jbtn;
private JTextField jtf;
//private LoginFrame lf;
public static void main(String[] args) {
new LoginFrame();
}
private void close(){
this.setVisible(false);
}
public LoginFrame(){
//lf=this;
this.setLocation(100,100);
this.setSize(400, 100);
this.setTitle("用户连接");
this.setResizable(false);
this.setLayout(new FlowLayout());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
jl=new JLabel("输入用户名:");
jtf=new JTextField(25);
jbtn=new JButton("连接");
jbtn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
String name=jtf.getText();
if(name==null||name.trim().equals("")){
JOptionPane.showMessageDialog(null, "输入你的名字");
return;
}
new ClientFrame(name);
//lf.setVisible(false);
close();
}
});
this.add(jl);
this.add(jtf);
this.add(jbtn);
this.setVisible(true);
}
}
2...............................................................
package xiaowen.gui.chat03;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Server {
public static final String HOST="127.0.0.1";
public static final int PORT=6868;
public static final String DISCONNECT_TOKEN="disconnect";
public static final String TRAN_USER_FLAG="connect:";
public static final String CHAR_FLAG_START="to:";
public static final String CHAR_FLAG_END=":end";
private Map<String,ServerThread> cs;
public static void main(String[] args) {
new Server().startup();
}
private void startup(){
ServerSocket ss=null;
try {
ss=new ServerSocket(PORT);
cs=new HashMap<String,ServerThread>();
while(true){
try {
Socket s=ss.accept();
new Thread(new ServerThread(s)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(ss!=null) ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ServerThread implements Runnable{
private Socket s;
private BufferedReader br;
private PrintWriter out;
private String name;
private boolean stop=false;
public ServerThread(Socket s) throws IOException {
this.s=s;
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
out=new PrintWriter(s.getOutputStream(),true);
name=br.readLine();
name+="["+s.getInetAddress().getHostAddress()+"]";
cs.put(name,this);
send(name+"连接了");
sendUser();
}
private void sendUser(){
String us=TRAN_USER_FLAG;
Set<String> keys=cs.keySet();
for(String u:keys){
us+=u+",";
}
send(us);
}
private void close(){
stop=true;
out.println(DISCONNECT_TOKEN);
cs.remove(name);
send(name+"断开连接了");
sendUser();
}
private void send(String msg){
Set<String> keys=cs.keySet();
for(String key:keys){
cs.get(key).out.println(msg);
}
}
private String getUsersByMsg(String msg){
String str=msg.substring(CHAR_FLAG_START.length(), msg.indexOf(CHAR_FLAG_END));
return str;
}
private String formatMsg(String msg){
String str=msg.substring(msg.indexOf(CHAR_FLAG_END)+CHAR_FLAG_END.length());
return str;
}
@Override
public void run() {
try {
while(true){
if(stop) break;
String str=br.readLine();
if(str.equals(DISCONNECT_TOKEN)){
close();
break;
}
String us=getUsersByMsg(str);
String msg=formatMsg(str);
if(us.equals("all")){
send(name+":"+msg+"[群]");
} else{
sendPrivateUsers(us,msg);
}
//System.out.println(us);
//System.out.println(name+str);
}
} catch(SocketException e){
System.out.println(name+"非正常离开了");
close();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(s!=null) s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void sendPrivateUsers(String us, String msg) {
String[] uus=us.split(",");
for(String u:uus){
cs.get(u).out.println(name+":"+msg+"[私]");
}
}
}
}
3.......................................................................................
package xiaowen.gui.chat03;
import java.awt.BorderLayout;
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.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class ClientFrame extends JFrame {
private JTextArea jta;
private JTextField jtf;
private JPanel jp;
private JButton jbtn;
private JScrollPane jsp1,jsp2;
private JList list;
private DefaultListModel model;
private String name;
private Socket s;
private BufferedReader br;
private PrintWriter out;
private boolean stop=false;
public ClientFrame(String name){
this.setSize(800, 600);
this.setLocation(100, 100);
this.name=name;
this.setTitle("网络聊天!当前用户是:"+this.name);
//this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
out.println(Server.DISCONNECT_TOKEN);
}
});
jta=new JTextArea();
jsp1=new JScrollPane(jta);
jtf=new JTextField(35);
jbtn=new JButton("发送");
jbtn.addActionListener(new BtnClick());
model=new DefaultListModel();
list=new JList(model);
list.setFixedCellWidth(100);//设置宽度之后,如果宽度不够,会使用...
jsp2=new JScrollPane(list);
jp=new JPanel();
this.add(jsp1);
jp.add(jtf);
jp.add(jbtn);
this.add(jp,BorderLayout.SOUTH);
this.add(jsp2, BorderLayout.WEST);
jtf.addKeyListener(new KeyClick());
connect();
this.setVisible(true);
}
private void connect(){
try {
s=new Socket(Server.HOST,Server.PORT);
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
out=new PrintWriter(s.getOutputStream(),true);
out.println(name);
new Thread(new ReceiveThread()).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class KeyClick extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER){
send();
}
}
}
private void send(){
String word=jtf.getText();
if(word==null||word.trim().equals("")){
return;
}
Object[] vals=list.getSelectedValues();
boolean isAll=false;
String us=Server.CHAR_FLAG_START;
if(vals.length<=0) isAll=true;//没选人就是向所有人发布
for(Object v:vals){
if(v.toString().equals("所有人")){
isAll=true;
break;
} else{
us+=v.toString()+",";
}
}
if(isAll){
out.println(us+"all"+Server.CHAR_FLAG_END+word);
} else{
out.println(us+Server.CHAR_FLAG_END+word);
}
jtf.setText("");
}
private void close(){
stop=true;
}
private void handleList(String str){
String users=str.substring(Server.TRAN_USER_FLAG.length());
//System.out.println(users);
model.removeAllElements();//每次都清空
String[] us=users.split(",");
for(String u:us){
model.addElement(u);
}
model.addElement("所有人:");
}
private void receive() throws IOException{
String str=br.readLine();
if(str.equals(Server.DISCONNECT_TOKEN)){
close();
}
if(str.startsWith(Server.TRAN_USER_FLAG)){
handleList(str);
return;
}
jta.setText(jta.getText()+str+"\n");
System.out.println(str);
}
private class ReceiveThread implements Runnable{
@Override
public void run() {
try {
while(true){
if(stop) break;
receive();
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(s!=null) s.close();
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
}
}
private class BtnClick implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jbtn){
send();
}
}
}
}