65.9K
CodeProject 正在变化。 阅读更多。
Home

带可定制 GUI 的 Java 聊天

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (93投票s)

2002 年 6 月 15 日

CPOL

3分钟阅读

viewsIcon

1215382

downloadIcon

63319

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

Sample Image - chat.jpg

注意:最新的源代码已与本文一起上传。

引言

这是我在 Code Project 上的第二篇文章。我已经在这里发布了 Java 中的 Tap Control

这个 Java 聊天室完全基于 AWT,未使用 Swing 组件,但仍然具有出色的外观。 对于此应用程序,我开发了自己的选项卡控件和图像画布。 此外,我已经将完整的源代码上传到这里。 您可以从 那里下载。

这是更新后的文章。 现在,我发布了聊天背后的所有概念,而不是按照 Code Project 成员的要求发布源代码。
根据 Code Project 成员的要求,我现在发布了聊天背后的所有概念,而不是提供源代码。

特点

  1. 传输带有文本的表情符号
  2. 私人聊天
  3. 外观精美,颜色可定制
  4. 音频已启用

描述

在这个聊天应用程序中,我们有服务器端和客户端模块。 在服务器端,我定义了自己的 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 与我联系。

© . All rights reserved.