Summary: This article describes in detail the development process of an AWT version of java chat software, and focuses on how to use the AWT component to implement the personalized interface of the software.
Introduction
This Java chat software is purely based on AWT components and does not use any Swing components. In this program, I developed my own Tab controls and image canvases and provided complete source code analysis. For the software implementation interface, see:
Software features
1) use this article to pass smiling face images
2) Private Chat
3) Customized color-based good interface
4) Audio Functions
Description
In the software, the server and client modules are implemented. On the server side, I defined my own RFC command. The commands used in this application include:
HELO-initialize the connection to the server
QUIT-the user exits from the chat room
KICK-Disable pre-chat
CHRO-change chat room
MESS-send Common Information
PRIV-send private information
ROCO-gets the number of chats in a specified chat room
CALL-invite voice chat (not included in this example)
Server Module Design
In this module, I want to explain the following:
· Create a custom UserObject class that contains detailed client information such as the user name, user socket, and chat room name.
· When the server is running, it activates the server socket on port 1436 (which can be modified as well) and waits for the client connection. If the customer connects to the server, it will activate an independent service thread. In this way, when the customer sends the "QUIT" command, it will turn off the thread. For details, see the detailed programming in the source file ChatCommunication. java.
The following sample code obtains the connection from the chat room client and creates a new ChatCommunication object. In the ChatCommunication class, we will create a dedicated thread to monitor all the commands from the client and make corresponding answers.
// ChatServer. java
............
While (true)
{
Socket socket = serversocket. accept ();
ChatCommunication chat = new ChatCommunication (socket );
}
.........
// ChatCommunication. java
..........
ChatCommuncation (Socket socket)
{
Personalsocket = sokcet;
Dout = new Dataoutputstream (personalsocket. getoutoutstream ());
.....
}
Client Module Design
In this module, I want to explain the following:
· When the client is running, it activates a socket and sends a helo rfc to the server to establish a connection with the ChatServer. Once connected, the client will keep the socket connection and communication with the server, no matter when the user sends the command.
· User interface design. I have created a customized Tab component and a message canvas supported by Image.
· The basic logic for creating a message canvas is simpler: No matter when a user inputs a message, I store the message in an array list. In addition, in this list, I keep the offset positions of X and Y for each message. For details, see the following source code explanation:
// Ex:
...........
For (int I = 0; I <messagearraylist. size (); I ++)
{
PaintMessageToMessageCanvas (MessageObject) messagearraylist. get (I );
}.........
/*************************************** ***********************
The following function is used to draw images and text messages.
**************************************** **********************/
Private void paintmessage1_canvas (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 the 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 the image area ********/
If (messageobject. IsImage = true)
{
Tokenizer = new StringTokenizer (Message ,"");
While (tokenizer. hasMoreTokens ())
{
TokenString = tokenizer. nextToken ();
If (TokenString. indexOf ("~~ ")> = 0)
{
/******** If the image is correct *************/
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