服务器端代码:
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();