带可定制 GUI 的 Java 聊天
一个完整的 Java (AWT) 聊天应用程序,具有出色的可自定义 GUI 界面。它具有一般聊天和私人聊天,消息到达时播放音乐,发送图像等功能

注意:最新的源代码已与本文一起上传。
引言
这是我在 Code Project 上的第二篇文章。我已经在这里发布了 Java 中的 Tap Control。
这个 Java 聊天室完全基于 AWT,未使用 Swing 组件,但仍然具有出色的外观。 对于此应用程序,我开发了自己的选项卡控件和图像画布。 此外,我已经将完整的源代码上传到这里。 您可以从 那里下载。
这是更新后的文章。 现在,我发布了聊天背后的所有概念,而不是按照 Code Project 成员的要求发布源代码。
根据 Code Project 成员的要求,我现在发布了聊天背后的所有概念,而不是提供源代码。
特点
- 传输带有文本的表情符号
- 私人聊天
- 外观精美,颜色可定制
- 音频已启用
描述
在这个聊天应用程序中,我们有服务器端和客户端模块。 在服务器端,我定义了自己的 RFC 命令。 我在此应用程序中使用的一些命令如下
HELO
- 初始化与服务器的连接QUIT
- 从聊天中删除用户KICK
- 从聊天中踢出CHRO
- 更改房间MESS
- 发送一般消息PRIV
- 发送私人消息ROCO
- 获取指定房间中的用户数CALL
- 请求语音聊天(不包含在此版本中)
服务器端模块
我将简要解释服务器端背后的概念。
- 创建了自定义
UserObject
类,它将具有客户端详细信息,如用户名,用户的套接字和房间名称等。 - 当聊天服务器运行时,它会在端口 1436(我们也可以修改)打开服务器套接字并侦听客户端连接。 如果客户端连接到服务器,它将打开一个单独的线程来提供服务。 因此,当客户端发送
QUIT
命令时,它也会关闭该线程。 如果你查看ChatCommunication.java,你将获得所有详细信息。
这是从聊天客户端获取连接并创建 ChatCommunication
的新对象的示例代码。 在 ChatCommunication
类中,我们将创建一个线程来监视来自客户端的所有命令,并响应客户端。
ChatServer.java
while(true
{
Socket socket = serversocket.accept();
ChatCommunication chat = new ChatCommunication(socket);
}
.........
ChatCommunication.java
..........
ChatCommuncation(Socket socket)
{
personalsocket = socket;
dout = new Dataoutputstream(personalsocket.getoutoutstream());
.....
}
客户端模块
我还将简要解释客户端聊天背后的概念。
- 当聊天客户端运行时,它将打开一个套接字并通过发送
HELO RFC
连接到ChatServer
。 连接后,聊天客户端将保持套接字连接并在用户发出命令时与服务器通信。 - 客户端模块中的另一个重要的事情是用户界面。 我创建了我自己的自定义组件,如选项卡控件和支持图像的消息画布。
- 创建消息画布的基本思想基于简单的逻辑。 每当用户输入消息时,我将其存储在数组列表中。 此外,在 Arraylist 中,我保留每个消息的
XOffset
和YOffSet
位置。 如果你查看此示例代码,你可能会了解我的意思。
Ex:
...........
for(int i =0; i < messagearraylist.size();i++)
{
PaintMessageToMessageCanvas((MessageObject)messagearraylist.get(i);
}.........
**************************************************************
This is the Function To Paint Images and Text Messages
**************************************************************
private void PaintMessageIntoCanvas(MessageObject messageObject)
{
int m_YPos = messageobject.StartY - YOffset;
int m_XPos = 5 - XOffset;
int CustomWidth = 0;
String Message = messageobject.Message;
/*************Print The User Name in UserName Font **************/
if(Message.indexOf(":") >= 0)
{
graphics.setFont(UserNameFont);
chatclient.getGraphics().setFont(UserNameFont);
fontmetrics = chatclient.getGraphics().getFontMetrics();
String m_UserName = Message.substring(0,Message.indexOf(":")+1);
graphics.drawString(m_UserName,m_XPos+CustomWidth,m_YPos);
CustomWidth+=fontmetrics.stringWidth(m_UserName)+HorizantalSpace;
Message = Message.substring(Message.indexOf(":")+1);
}
/*********Set the Text Font **********/
chatclient.getGraphics().setFont(TextFont);
graphics.setFont(TextFont);
fontmetrics = chatclient.getGraphics().getFontMetrics();
/**********Print Image Area********/
if(messageobject.IsImage == true)
{
tokenizer = new StringTokenizer(Message," ");
while(tokenizer.hasMoreTokens())
{
TokenString = tokenizer.nextToken();
if(TokenString.indexOf("~~") >= 0)
{
/********If its a Proper Image*************/
try {
int m_ImageIndex = Integer.parseInt(TokenString.substring(2));
if((m_ImageIndex >= 0) && (m_ImageIndex < chatclient.IconCount))
{
graphics.drawImage(chatclient.IconArray[m_ImageIndex]
,m_XPos+CustomWidth,m_YPos - 15,messageobject.Width,messageobject.Height,this);
CustomWidth+=messageobject.Width+HorizantalSpace;
}
}catch(Exception _Exc) { }
}
else
{
graphics.drawString(TokenString,m_XPos+CustomWidth,m_YPos);
CustomWidth+=fontmetrics.stringWidth(TokenString)+HorizantalSpace;
}
if(TotalWidth < m_XPos+CustomWidth)
{
TotalWidth = m_XPos+CustomWidth;
scrollview.setValues(TotalWidth,TotalHeight);
}
.................
}
结论
在这篇更新的文章中,我已经上传了完整的源代码。 要下载完整的源代码,请单击此处。
如果您还有任何疑问,请随时通过 vavjeeva@gmail.com 与我联系。