java 嘻嘻哈哈聊天室

这是一个基于Java实现的简单聊天室系统,包括服务端和客户端两部分。服务端负责接收客户端的连接请求,并将信息广播给所有在线用户;客户端则提供图形界面供用户发送消息。

服务端

package 夏日聊天室;






import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class chatServer 
{
private ServerSocket server;
private Socket clientSocket;
private DataInputStream serverin;
private DataOutputStream serverout;
private Waiter[] waiters;
public static final int max = 50;
public static final int noroom = -1;
public chatServer()
{
waiters=new Waiter[max];
int i;
for(i=0;i<max;i++)
{
waiters[i]=null;
}
try 
{
System.out.println("建立服务器中...");
server=new ServerSocket(54188);

} catch (IOException e) 
{

e.printStackTrace();
}
}
public int getFreeWaiter()
{
int index;
for(index=0;index<waiters.length&&waiters[index]!=null;index++)
;
if(index>=max)
index=noroom;
return index;
}


public void  listenning()
{
boolean ok=true;
String mess;
while (ok)
{
try 
{
System.out.println("倾听中...");
clientSocket=server.accept();
System.out.println(clientSocket.getInetAddress()+"接入");
int i;
i=getFreeWaiter();
if(i!=noroom)
{
waiters[i]=new Waiter(clientSocket,i);
waiters[i].start();
}
else
{
serverin=new DataInputStream(clientSocket.getInputStream());
serverout=new DataOutputStream(clientSocket.getOutputStream());
serverout.writeUTF("O\n");
mess = serverin.readUTF();
serverin.close();
serverout.close();
clientSocket.close();
}
} catch (IOException e) 
{

e.printStackTrace();
ok=false;
}
}
}
class Waiter extends Thread
{
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private int index;
private String nickName;
boolean goon=true;

public Waiter(){}
public Waiter (Socket socket,int index)
{
this.socket=socket;
this.index=index;
try 
{
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
} catch (IOException e) 
{

e.printStackTrace();
}
}
private void dealMessage(String mess)
{
String[] detailMess;
String command;

detailMess=mess.split("\n");
command=detailMess[0];
if(command.equals("hello"))
{
nickName=detailMess[1];
try 
{
out.writeUTF("youare\n"+(index+100+"").substring(1));
int i;
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
out.writeUTF("Friend\n"+(waiters[i].index+101+"").substring(1)+waiters[i].nickName);
}
}
String newFriend=((index+101+"").substring(1)+""+nickName);
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
waiters[i].out.writeUTF("New\n"+newFriend);
}
}
} catch (IOException e) 
{
// TODO 异常关闭
goon=false;
e.printStackTrace();
}
}
else if(command.equals("bye"))
{
try 
{
out.writeUTF("bye\n");
int i;
String offFriend=((index+101+"").substring(1)+""+nickName);
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
waiters[i].out.writeUTF("off\n"+offFriend);
}
}

} catch (IOException e) 
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
goon=false;
}
else if(command.equals("all"))
{
int i;
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
try 
{
waiters[i].out.writeUTF(mess);
} catch (IOException e) 
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
goon=false;
}
else if(command.equals("sigle"))
{
try 
{
int targetIndex=Integer.parseInt(detailMess[3]);
String  Message=detailMess[0]+"\n"+detailMess[2]+"\n"+detailMess[5];
waiters[targetIndex].out.writeUTF(Message);

} catch (IOException e) 
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
goon=false;
}

}
public void run()
{
String mess;
while (goon)
{
try 
{
mess=in.readUTF();
dealMessage(mess);
} catch (IOException e) 
{

e.printStackTrace();
goon=false;
}
}
try 
{
System.out.println(socket.getInetAddress()+"下线了");
in.close();
out.close();
socket.close();
waiters[index]=null;
} catch (IOException e) 
{

e.printStackTrace();
}


}
}
public static void main(String[] args)
{
chatServer cs=new chatServer();
cs.listenning();
}
}

客户端









import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;


import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


public class chatClient 
{
private JFrame jfrmMain;
private Container container;
private JLabel  jlblTopic;
private JTextArea jtxaChatContent;
private JScrollPane jscpChatContent;
private JLabel jlblFriendList;
private DefaultListModel  dimFriendList;
private JList jlstFriendList;
private JScrollPane jscpFriendList;
private JLabel jlblSystemInformation;
private DefaultListModel  dimSystemInformation;
private JList jlstSystemInformation;
private JScrollPane jscpSystemInformation;
private JLabel jlblCurrentFriendTopic;
private JLabel jlblCurrentFriend;
private JLabel jlblNickName;
private JTextField jtxtMessage;
private JPasswordField jpsd;
private JButton jbtnExit;
private JButton jbtnSend;
private String nickName;
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private int index;
public chatClient(String nickName)
{
this.nickName=nickName;
initFrame();
reinitFrame();
try 
{
linkServer();
new Listenner();

Thread.sleep(500);
out.writeUTF("hello\n"+nickName);
} catch (Exception e) 
{

showMessage(jfrmMain,e.getMessage()+"\n连接服务器失败");
jfrmMain.dispose();
}
dealAction();


}

private void showMessage(JFrame jfrm,String mess)
{
JOptionPane.showMessageDialog(jfrm, mess,"系统提示",JOptionPane.DEFAULT_OPTION);
}

private void linkServer() throws Exception
{
try
{
socket=new Socket("localhost",54188);

}catch(IOException e)
{
throw new Exception("Class:chatClient:\nlinkServer\nError:连接服务器失败");

}

try 
{
in=new DataInputStream(socket.getInputStream());

} catch (IOException e) 
{

throw new Exception("输入通信信道失败");
}
try 
{
out=new DataOutputStream(socket.getOutputStream());

} catch (IOException e) 
{

throw new Exception("输出通信信道失败");
}

}

public void initFrame()
{
Dimension dim;

Font normalFont=new Font("宋体",Font.PLAIN,16);
//窗口实现
jfrmMain=new JFrame("聊天室");
container=jfrmMain.getContentPane();
container.setLayout(null);
jfrmMain.setFont(normalFont);
jfrmMain.setSize(11200/15,9045/15);
 //居中工作
dim=Toolkit.getDefaultToolkit().getScreenSize();
jfrmMain.setLocation((dim.width-jfrmMain.getWidth())/2,(dim.height-jfrmMain.getHeight())/2);

jfrmMain.setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\zhao\\Desktop\\java\\夏日聊天室\\图片\\图标.jpg"));
jfrmMain.setVisible(true);
jfrmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//标题
jlblTopic=new JLabel("嘻嘻哈哈聊天室");
jlblTopic.setFont(new Font("宋体",Font.PLAIN,36));
jlblTopic.setForeground(Color.gray);
jlblTopic.setBounds(3592/15,0,3780/15,525/15);
container.add(jlblTopic);

//带滚动条的文本框,聊天框
jtxaChatContent=new JTextArea();
jscpChatContent=new JScrollPane(jtxaChatContent);
jtxaChatContent.setFont(normalFont);
jscpChatContent.setBounds(1575/15,670/15,7815/15,6690/15);
container.add(jscpChatContent);

//在线好友
jlblFriendList=new JLabel("好友列表");
jlblFriendList.setFont(normalFont);
jlblFriendList.setBounds(315/15,525/15,960/15,240/15);
container.add(jlblFriendList);

dimFriendList=new DefaultListModel();
jlstFriendList=new JList(dimFriendList);
jscpFriendList=new JScrollPane(jlstFriendList);
jlstFriendList.setFont(normalFont);
jscpFriendList.setBounds(75/15,825/15,1440/15,5820/15);
container.add(jscpFriendList);
//系统消息
jlblSystemInformation=new JLabel("系统消息");
jlblSystemInformation.setFont(normalFont);
jlblSystemInformation.setBounds(9690/15,525/15,960/15,240/15);
container.add(jlblSystemInformation);

dimSystemInformation=new DefaultListModel();
jlstSystemInformation=new JList(dimSystemInformation);
jscpSystemInformation=new JScrollPane(jlstSystemInformation);
jlstSystemInformation.setFont(normalFont);
jscpSystemInformation.setBounds(9450/15,825/15,1440/15,5820/15);
container.add(jscpSystemInformation);

jlblCurrentFriendTopic=new JLabel("当前好友");
jlblCurrentFriendTopic.setFont(normalFont);
jlblCurrentFriendTopic.setBounds(315/15,6750/15,960/15,240/15);
container.add(jlblCurrentFriendTopic);

jlblCurrentFriend=new JLabel("00所有人");
jlblCurrentFriend.setFont(normalFont);
jlblCurrentFriend.setBounds(60/15,7050/15,1470/15,240/15+8);
container. add(jlblCurrentFriend);

jlblNickName=new JLabel("用户昵称");
jlblNickName.setFont(normalFont);
jlblNickName.setBounds(90/15,7575/15,1470/15,245/15+8);
container. add(jlblNickName);

//输入框
jtxtMessage=new JTextField();
jtxtMessage.setFont(normalFont);
jtxtMessage.setBounds(1575/15, 7600/15, 9240/15, 390/15);
container. add(jtxtMessage);
//退出
jbtnExit=new JButton("退出");
jbtnExit.setBounds(150/15,7950/15,990/15,465/15);
jbtnExit.setFont(normalFont);
container.add(jbtnExit);
//发送
jbtnSend=new JButton("发送");
jbtnSend.setBounds(9830/15,7950/15,990/15,465/15);
jbtnSend.setFont(normalFont);
container.add(jbtnSend);
}
public void reinitFrame()
{
jscpChatContent.setBorder(BorderFactory.createTitledBorder("聊天记录"));
jlblCurrentFriend.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jlblNickName.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jlblCurrentFriend.setHorizontalAlignment(JLabel.CENTER);
jlblNickName.setHorizontalAlignment(JLabel.CENTER);
dimFriendList.addElement("00所有人");
jlblNickName.setText(nickName);
dimSystemInformation.addElement("您已进入聊天室,请文明聊天");
dimSystemInformation.addElement("祝你聊天愉快");

}
public void saygoodbye()
{
try 
{
out.writeUTF("bye\n");
showMessage(jfrmMain, "您已退出聊天室");
jfrmMain.dispose();
} catch (IOException e1) 
{
// TODO 自动生成的 catch 块
e1.printStackTrace();
}

}
public void dealAction()
{
jbtnSend.addActionListener
(
new ActionListener()
{


@Override
public void actionPerformed(ActionEvent e) 
{
String currentFriend=jlblCurrentFriend.getText();
String commandServer;
String speaker;
String speakerIndex;
String receiver;
String receiverIndex;
String messageToServer;
speakerIndex=index+"\n";
speaker=(index+101+"").substring(1)+" "+nickName+"\n";
if(currentFriend.equals("00所有人"))
{
commandServer="all\n";
messageToServer=commandServer+speaker+jtxtMessage.getText();
jtxaChatContent.append("你向所有人喊道:"+jtxtMessage.getText()+"\n");
}

else
{
commandServer="sigle\n";
receiver=jlblCurrentFriend.getText()+"\n";
receiverIndex=receiver.substring(0, 2);
receiverIndex=(Integer.parseInt(receiverIndex)-1)+"\n";
messageToServer=commandServer+speakerIndex+speaker+receiverIndex+receiver+jtxtMessage.getText();
jtxaChatContent.append("你对"+currentFriend+"说:"+jtxtMessage.getText()+"\n");
}

try 
{
out.writeUTF(messageToServer);

jtxtMessage.setText("");
} catch (IOException e1) 
{
// TODO 自动生成的 catch 块
e1.printStackTrace();
}


}

}
);
jtxtMessage.addCaretListener
(
new CaretListener()
{


@Override
public void caretUpdate(CaretEvent e)
{
if(jtxtMessage.getText().trim().length()<=0)
jbtnSend.setEnabled(false);
else 
jbtnSend.setEnabled(true);

}

}
);
jlstFriendList.addListSelectionListener
(
new ListSelectionListener()
{


@Override
public void valueChanged(ListSelectionEvent e) 
{
String selectedFriend;
selectedFriend=jlstFriendList.getSelectedValue().toString();
jlblCurrentFriend.setText(selectedFriend);
}

}
);
jfrmMain.addWindowListener
(
new WindowListener()
{
public void windowClosing(WindowEvent e) 
{
saygoodbye();
}


@Override
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowOpened(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}




}
);
//退出
jbtnExit.addActionListener
(
new ActionListener()
{


@Override
public void actionPerformed(ActionEvent e) 
{
//进行下线操作
saygoodbye();


}

}
);
}

class Listenner extends Thread
{
private boolean goon=true;
public  Listenner()
{
goon=true;

this.start();
}
private void dealMessageFromServer(String mess) 
{
String[] splitMess;
String command;

splitMess=mess.split("\n");
command=splitMess[0];
System.out.print(command);
if(command.equals("youare"))
{
index = Integer.parseInt(splitMess[1]);

}
else if(command.equals("Friend"))
{
String friendInformation=splitMess[1];

dimFriendList.addElement(friendInformation);
}
else if(command.equals("New"))
{
String newFriend=splitMess[1];

dimFriendList.addElement(newFriend);

dimSystemInformation.addElement(newFriend+"上线了");
}
else if(command.equals("off"))
{
String offFriend=splitMess[1];

dimFriendList.removeElement(offFriend);

dimSystemInformation.addElement(offFriend+"下线了");
}
else if(command.equals("all"))
{
jtxaChatContent.append(splitMess[1]+"对所有人说:"+splitMess[2]+"\n");
}
else if(command.equals("sigle"))
{
jtxaChatContent.append(splitMess[1]+"对你说:"+splitMess[2]+"\n");
}
else if(command.equals("bye"))
{
goon=false;
try 
{
in.close();
out.close();
socket.close();

//这里是否还需要处理
jfrmMain.dispose();
} catch (IOException e) 
{

e.printStackTrace();
}
}
}

public void run()
{
String mess=null;

while(goon)
{
try 
{
mess=in.readUTF();

dealMessageFromServer(mess);

} catch (IOException e) 
{
// 服务端异常关闭
goon=false;

}
}
}



}

public static void main(String[] args)
{
chatClient chat;
chat=new chatClient("22");

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值