聊天程序(群聊和私聊)

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();
}
}

}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值