In both client and server classes, I have an exact same inner class called Data. This Data object is being sent from the server using:
ObjectOutputStream out
When you use some class in two different JVMs, and you are marshalling/unmarshalling the class then the class should be exported to a common library and shared between both server and client. Having different class wont work any time.
What you are trying to do is marshall TCPServer$Data and unmarshall as TCPClient$Data. That is incompatible.