The C++ Windows Application
Let's examine the C++ Windows server application, which also uses sockets to communicate over the network. This implementation is unaware of whether the client connecting to it is written in Java, C/C++, or any other language. The use of XML further ensures that the communication will succeed.
When the server application starts, an instance of the ServerSocket class is created (Listing Three and the complete C++ server are available here) which listens on port 8080 for new client connections. In summary, this class uses Windows Sockets to create a network socket, and then listen on it and accept new client connection requests as they arrive:
// Start winsock and create the socket
WSAStartup(...);
listenSocket = socket(...);
// TCP bind and listen
bind( listenSocket, ... );
listen( listenSocket, SOMAXCONN);
while ( listening ) {
// Accept a client socket (
clientSocket = accept(listenSocket, NULL, NULL);
// ...
}
Given that the call to accept() blocks until a new client connects, this code is executed in its own thread. Once a client does connect, the resulting code is similar to the Java socket implementation in that objects are created to handle sending data over the socket, and listening for data to arrive:
// Setup the socket sender and listener sender = new SocketSender(clientSocket); listener = new SocketListener(clientSocket); listener->setSender(sender); listener->startThread();
Again, as with the Java socket code, the SocketListener class executes the Windows sockets recv() method, which blocks until data arrives, in its own thread:
char recvbuf[BUFFERLEN];
int bytes;
while ( true ) {
bytes = recv(clientSocket, recvbuf, BUFFERLEN, 0);
if (bytes > 0) {
recvbuf[bytes-1] = 0; // null terminate the string
HandleMessage(recvbuf);
}
}
Each request is further processed in HandleMessage(), and the appropriate response is sent back to the client:
int num = rand(); sprintf_s(buffer, "<Response><Name>RandomNumberResponse</Name>\ <Number>%i</Number></Response>\n", num); send( clientSocket, buffer, strlen(buffer), 0 );
Conclusion
You should now have a basic understanding of how Java and C/C++ applications can communicate via network socket programming. In fact, although the sample server application explored here uses Windows sockets, a comparable Linux application can be developed to work equally well with the Java client presented here. Combined with XML, this should provide a suitable solution in some cases. To learn about other application integration techniques, such as with JNI, JMS, or web services, take a look at the following articles:



