At the basic level, the design of the project includes two components:
This design has been chosen in order to accomplish the goal of the project: having a distributed ICQ client that would provide the easiest interface to the user.
The client has been written as a Java applet since this is an application that can run on almost any browser (or any other Java VM) and therefore would enable great portability for one's ICQ account.
The server, however, needed to handle great loads of communication (supporting multiple sessions at the same time) and therefore had to be written at the lowest possible level.
Since the server is required to send information to the user when an event occurs in the ICQ connection, we needed to have a bi-directional connection between the client and the server. This is why we chose using the socket interface to do that instead of alternative interfaces such as the Java object serialization.
Had we used object serialization, we would have a connection that could be initiated by one side only (the client). Therefore we would have to have some polling mechanism in the client side to poll the server from time to time and check for new messages that would be sent in return. This method is both bandwidth consuming and awkward to implement. The socket interface seemed to be a much better choice for our purposes.
The fact that we needed a low-level implementation and the fact that we could not use Java object serialization made the choice of development environment for the server very easy. A server written in C will be both light-weight and native to the socket interface.
In addition, the icqlib library that we use to connect to the ICQ network is native to C in system V environment (such as Linux). So using Java on the server side would not only require excessive tools and complication but also would not serve the purpose of making the application multi-platform.
The use of C as a main programming environment with pthreads and icqlib as library additions seems to be the best tool for the job.