首页 > > 详细

讲解Peer to Peer Chat 编程、讲解留学生C/C++程序、Software Development 编程讲解

Software Development with C++ - Assignment 2 SP5 2017 Page 1 of 5
School of Information Technology and Mathematical Sciences
COMP 3023 Software Development with C++
Assignment 2
Peer to Peer Chat
Your task is to create a peer to peer chat program with Qt. You have been given networking code that finds and
connects to peers on the local network and a GUI that demonstrates the basics of how the networking code is
used.
You must extend the given project to provide user profile support, images, private chatrooms and private
messaging.
The program's interface must allow the user to do the following:
• Set their nickname (aka username or handle).
• Set user profile details, including an image file, time zone and location.
• Send messages.
• Send private messages to users.
• Create private chatrooms.
• Invite users to private chatrooms.
• Join private chatrooms.
• Kick users from private rooms.
• Send files to rooms.
• Send files to users.
• Save chat transcripts to files (excluding exchanged files)
The program will be using Qt, and will need to utilise the Qt data types.
The supplied networking code handles passing messages between clients, and all running clients (on the same
local network) automatically connect to each other in the main (public) chatroom. The code in the Networking
folder will not need modification.

Software Development with C++ - Assignment 2 SP5 2017 Page 2 of 5
Handling Messages
The MessageFactory follows a version of the Abstract Factory Pattern and handles messages passed from the
network. Each message's type is defined by a number (id) passed to the MessageFactory::create() member
function.
Abstract Factory Pattern – Provide an interface for creating families of related classes, without
calling concrete class constructors.
The program must implement the following message types:
TextMessage
This message contains a message for display in the public chatroom, it will be displayed on all user's screens.
ImageMessage
This message contains an image, it may be displayed as an image in the relevant room, or displayed as a link with
a pop up window that displays the message.
PrivateMessage
This message contains a message sent from one user directly to another, this message will not be shown in the
public chatroom. This should be displayed in a separate window, one per user.
FileMessage
This message contains a file, it should be displayed in the relevant chatroom as a link, that allows the user to save
the file to a location on disk. The file should be saved to a temporary location on receipt of the message (to save
memory).
ActionMessage
This message contains an action – invite, kick, join, leave. These allow users to join and leave private chatrooms.
IdentityMessage
This message contains the nickname, image, time zone and location of the user, this should be sent anytime the
user's profile details change. Note: the nickname must not be changed while the user is online.

The above names are the names that must be used for the message classes. They must derive from the Message
class, see the Message class documentation for what each member function must do.

The TextMessage class has already been implemented, as a demonstration.

Software Development with C++ - Assignment 2 SP5 2017 Page 3 of 5
Message Data Specification
Each message type has a specific data format as follows:
TextMessage
The data contains the text of a message (in UTF8 format).
ImageMessage
The data contains the name of the image, followed by a separator |, then the (raw binary) data for the image.
PrivateMessage
The data contains either a room name (for messages to private chatrooms) or a username (for private messages)
followed by a separator |, then the message text (again UTF8 encoded).
FileMessage
The data contains the name of the file, a separator | followed by the data for the file.
ActionMessage
The data contains the action name, a separator | followed by the operands separated by |
Action Operands Description
JOIN Room name
invited name
Invited name must match the name sent
by the invite message. Send to the user
who invited. That user forwards to all
other users in the private chatroom.
LEAVE Room name Send to all private room participants
when user leaves a private room.
INVITE Room name
invitee
Sent from someone in a private room to
invite a user from the public chatroom,
sent only to the invitee, the invitee
operand is the user's unique identifier.
KICK Room name
nickname
Kick a user from a private room. The
message is sent to all connected users.
The Kicked user will be removed from
the room list on all clients.
IdentityMessage
The data contains the username, a separator |, a location, a separator |, a time zone, a separator |, and image
data.

The supplied code includes example data for messages of each type to allowing testing of message
implementations.

Software Development with C++ - Assignment 2 SP5 2017 Page 4 of 5
Chat Implementation Details
Peer to Peer
As there is no chat server, peers send messages directly to one another, these messages must be stored by each
client (chat program) to allow a chat history to be saved. Messages can be sent to either all clients (public) or
clients one at a time (private).
Unique Identifiers
Each connected user is uniquely identified by their nickname and their IP address. Multiple users can be
connected from one IP address, so long as they have different nicknames.
User Profiles
Each connected user can have profile information, this includes their nickname (which must not change while
they are online), a location, a time zone and an image. The image must be PNG formatted at a resolution of 48x48
pixels, to simplify accurate display on all clients. User profiles are sent via Identity messages, these must be sent
when new clients join the public chatroom (Hint: p2pnetworking::Client::newParticipant signal) or to
all participants when the user profile changes. The interface must allow the user to modify their profile (excluding
username) while they are connected. The interface must also handle this change from other users. It is suggested
that picture is displayed next to the user in the main GUI, although a pop-up window with the complete profile is
also acceptable, either way, the entire profile must be accessible.
Images
The chat program must allow users to send images to the public chatroom, private chatrooms and as private
messages to only one user. The image formats jpg, png and gif must be supported, but animation support is
optional. The images do not have to display in the main chat window, but must be accessible by a single click.
Users must be able to open a file browser to select an image to send, optionally support for drag and drop can be
added. (Hint: see the QFileDialog class documentation)
Files
Like images, the program must allow users to send files to the public chatroom, private chatrooms and directly to
other users in private messages. Again, users must be able to open a file browser to select an image to send,
optionally support for drag and drop can be added. The interface must provide a save dialog for saving a file to
disk. It is suggested that files are temporarily stored to disk during each session and deleted at the end, to prevent
exhausting memory or filling the disk with unnecessary files, use a scheme to prevent duplicate filenames from
overwriting each other i.e. handle when the same or different users to send multiple files with the same name at
different times. The file can then be copied from its temporary location to the location requested by the user in
the save dialog.
Private Chat
Private chat requires that participating chat clients have support for private chatroom. To support private
chatroom, an additional class will be required. This class must contain at least the name of the chatroom and the
names of each person in the chatroom. A user first invites another to a chatroom with an invite message. The join
message must be sent to the client who invited the user to private chatroom. The user who receives a join
following their invite must pass the join message to all other users in the private chatroom, this may be a member
function in the private chat class. A message into a private chatroom will be sent to all the members of that room
by the sender. (i.e. call the p2pnetworking::Client::sendMessage function overload that takes a
nickname parameter, one time per user in the chatroom).
Software Development with C++ - Assignment 2 SP5 2017 Page 5 of 5
Implementation Rules and Hints
If the menuBar, mainToolBar or statusBar are unused, remove the unused ones from your chatwindow.ui file.
To load images for display in the GUI, use the QImage::fromData() static member function, read the Qt QImage
documentation for details. One way to display the image: The QImage can be converted to a QPixmap to be
passed to a QLabel for display, however this is not the only way to display images.
You are free to use any of the Qt library classes, you may use C++ STL if you wish, however Qt classes are
generally a better fit for GUI applications. You may not use any additional libraries.
Follow the style. guide set for the course – see learnonline.
Marking
Your assignment will be marked both automatically and manually; automatically using unit testing, shell scripts
and static code analysis tools. Your code will be inspected for style. – remember consistency is the primary goal of
all style. guides, the easier it is to understand your code, the easier it is to allocate marks.
Criteria Marks
Message class implementations 20
MessageFactory::create() handles all messages 15
Interface meets all design specifications 20
Interface displays images – in profiles and messages 10
Private Messaging 5
Private Chatrooms, including invite, join and kick 10
Project compiles 5
Use of comments (Doxygen and others) 10
Project submitted correctly 5
IMPORTANT NOTE: a non-compiling project will get a maximum grade of 49/100.
A note about comments: comment blocks in Doxygen style. must be used in your header file to document your
classes and class members. Use comments sparingly in source files, document blocks of code (switch statements,
if else groups, loops, etc) rather than individual statements. i.e. Do not comment individual statements, unless the
outcome of the statement is not obvious.
Submission
You must submit your complete project folder inside a single zip file, in the same style. as you have been given.
Plagiarism
This is an individual assignment; your submitted files will be checked against other student’s code, and other
sources (e.g. StackOverflow), for instances of plagiarism.

联系我们
  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-21:00
  • 微信:codinghelp
热点标签

联系我们 - QQ: 99515681 微信:codinghelp
程序辅导网!