logo资料库

java实现聊天室功能(包含全部代码,有界面.docx

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
服务器端代码: import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; import javax.swing.*; public class Server { private static final int PORT=6666; G_Menu gm=new G_Menu(); private ServerSocket server; public ArrayList list; public static String user; public static ArrayList list1=new ArrayList();//定义用户集合 public User uu; public Server(String user) { this.user=user; } public void getServer() { list =new ArrayList(); try{ server=new ServerSocket(PORT); System.out.println("服务器启动,开始监听......"); while(true) { Socket client=server.accept();//接收客户端线程 PrintWriter writer = new PrintWriter(client.getOutputStream()); list.add(writer); Thread t = new Thread(new Chat(client)); t.start(); } }catch(Exception ex){ ex.printStackTrace(); } } public static void main(String[] args) { new Server(user).getServer(); } class Chat implements Runnable { Socket socket;
private BufferedReader br; private String msg; private String mssg=""; public Chat(Socket socket) { try{ this.socket=socket; }catch(Exception ex){ ex.printStackTrace(); } } public void run() { try{ br=new InputStreamReader(socket.getInputStream())); while((msg=br.readLine())!=null) { BufferedReader(new User 对象中 串 if(msg.equals("1008611"))//匹配字符串 显示好友列表 { msg=br.readLine(); String[] st=msg.split(":");//将用户信息跟消息分隔开 uu=new User(st[0],st[1],socket);// 将 用 户 信 息 添 加 到 list1.add(uu);//将对象添加到用户集合 Iterator it=Server.list1.iterator();//遍历用户集合 while(it.hasNext()) { User use=it.next(); msg=use.getName()+"("+use.getSex()+"):"; mssg+=msg;//将所有的用户信息连接成一个字符 } sendMessage("1008611");//显示好友列表匹配标识 sendMessage(mssg);//群发消息 } else if(msg.equals("10010"))//显示说话消息 { msg=br.readLine(); System.out.println(msg); sendMessage("10010");//显示说话信息匹配标识
sendMessage(msg); } else if(msg.equals("10086"))//显示进入聊天室 { msg=br.readLine(); System.out.println(msg); sendMessage("10086");//进入聊天室匹配标识 sendMessage(msg); } else if(msg.equals("841163574"))//私聊 { 息跟说话内容分开 msg=br.readLine(); String[] rt=msg.split("1072416535");//把传进来的用户信 System.out.println(rt[1]);//在服务器端显示说话内容 String[] tg=rt[0].split(":");//因为是私聊,传过来两个用户 的用户信息,这句作用是再把两个用户信息分开 Iterator iu=Server.list1.iterator();//遍历用户集合 while(iu.hasNext()) { User se=iu.next(); if(tg[1].equals(se.getName()+"("+se.getSex()+")"))// 如果传进来的用户信息跟集合中的用户信息吻合 { try{ PrintWriter(se.getSock().getOutputStream());//建立用户自己的流 PrintWriter pwriter=new pwriter.println("841163574");//匹配标识 pwriter.println(rt[1]);//向单独用户发送消 息 pwriter.flush(); System.out.println(rt[1]); }catch(Exception ex){ ex.printStackTrace(); } } else if(tg[0].equals(se.getName()))// 如 果 传 进 来 的 用户信息跟集合中的用户信息吻合 { try{ PrintWriter(se.getSock().getOutputStream());//建立用户自己的流 PrintWriter pwr=new pwr.println("841163574");//匹配标识 pwr.println(rt[1]);//向单独用户发送消息
pwr.flush(); System.out.println(rt[1]); }catch(Exception ex){ ex.printStackTrace(); } } } } else if(msg.equals("456987"))//下线 { msg=br.readLine(); System.out.println(msg);//在服务端显示信息 sendMessage("456987");//匹配字符串 sendMessage(msg);//匹配完毕后群发消息 String[] si=msg.split(":");//将传过来的用户名跟信息分 Iterator at=Server.list1.iterator();//遍历用户集合 while(at.hasNext()) { User sr=at.next(); if(sr.getName().equals(si[0]))//如果传过来的用户名 隔开 跟用户集合里的用户吻合 { } } break; list1.remove(sr);//将吻合的用户移除 sr.getSock().close();//关闭此用户的 socket } else if(msg.equals("123654"))//刷新 { String mssge=""; Iterator iter=Server.list1.iterator();//遍历用户集合 while(iter.hasNext()) { User uus=iter.next(); msg=uus.getName()+"("+uus.getSex()+"):"; mssge+=msg;//将所有的用户信息连接成一个字符 } sendMessage("123654");//发送刷新匹配标识 sendMessage(mssge);//群发消息 串
} } }catch(IOException ex){ ex.printStackTrace(); } } } public void sendMessage(String message)//群发消息方法 try{ for(PrintWriter pw:list)//输出流集合 { pw.println(message); pw.flush(); } }catch(Exception ex){ ex.printStackTrace(); } { } } 客户端代码: import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class Socket_one//客户端 { private static final int PORT=6666;//端口 public static String user; public static Socket socket; public Socket_one(String user) { this.user=user; try{ socket=new Socket("127.0.0.1",PORT);//建立 socket 连接 System.out.println("【"+user+"】欢迎来到聊天室!");
Thread tt=new Thread(new Recove(socket,user));//建立客户端线程 tt.start();//启动线程 }catch(Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) throws Exception { new Socket_one(user); } } class Recove implements Runnable { public String user; private Socket socket; private BufferedReader keybord; public BufferedReader br; private PrintWriter pw; private String msg; G_Menu gm=new G_Menu(); public Recove(Socket socket,String user) throws IOException { try{ this.socket=socket; this.user=user; }catch(Exception ex){ ex.printStackTrace(); } } public void run() { try{ br=new BufferedReader(new InputStreamReader(socket.getInputStream())); while((msg=br.readLine())!=null) { String message=msg; if(message.equals("1008611"))//匹配字符串 显示好友列表 {
隔开 好友列表 JCombox 消息 信息 室信息 室信息 gm.listModel1.clear();//接收前清空好友列表 gm.jcomb.removeAllItems();//清空 JCombox gm.jcomb.addItem("所有人"); message=br.readLine(); String[] str=message.split(":");//将接收到的所有用户信息分 for(String ss:str) { gm.listModel1.addElement(ss);//将所有用户信息添加到 gm.jcomb.addItem(ss);// 将 所 有 用 户 信 息 添 加 到 } } else if(message.equals("841163574"))//私聊 { message=br.readLine(); System.out.println("收到:"+message);//在服务器端显示私聊 gm.jta2.append(message+"\n");//在我的频道显示私聊信息 } else if(message.equals("10010"))//显示说话消息 { message=br.readLine(); System.out.println("收到:"+message);//在服务器端显示说话 gm.jta1.append(message+"\n");//在公共频道显示说话信息 gm.jta2.append(message+"\n");//在我的频道显示说话信息 } else if(message.equals("10086"))//显示进入聊天室 { message=br.readLine(); gm.jta1.append(message+"\n");//在公共频道显示进入聊天 gm.jta2.append(message+"\n");//在我的频道显示进入聊天 } else if(message.equals("123654"))//刷新 { gm.listModel1.clear();//将好友列表清空 gm.jcomb.removeAllItems();//将 JCombox 清空 gm.jcomb.addItem("所有人"); message=br.readLine(); String[] sr=message.split(":");//将接收到的用户信息分隔开
for(String sst:sr) { gm.listModel1.addElement(sst);////将刷新后所有用户信 gm.jcomb.addItem(sst);//将刷新后所有用户信息添加到 息添加到好友列表 JCombox } } else if(message.equals("456987"))//下线 { message=br.readLine(); gm.jta1.append(message+"\n");//在公共频道显示用户下线 gm.jta2.append(message+"\n");//在我的频道显示用户下线 信息 信息 } } }catch(IOException ex){ ex.printStackTrace(); } } } 登陆界面代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import javax.swing.border.*; class Landen extends Frame implements ActionListener { JFrame jf=new JFrame("聊天登陆"); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JPanel jp3=new JPanel();
分享到:
收藏