You can do P2P or client/server. I recommend client/server. Each client connects to the server with a persistent connection.
You don’t have to send strings and check if they start with a special character. You can use something like KryoNet and send whatever objects you want. So you would have a Chat object that has a field “String text”. KryoNet already tells you what player the object came from. A client sends a Chat object to the server, the server then sends an object to each other client so they can add the text to their chat window. You might call this ChatUpdate and it would have “String text” and “int fromPlayerID” which is the KryoNet player ID of the player that sent the chat message.
KryoNet comes with a client/server chat example:
http://code.google.com/p/kryonet/source/browse/trunk/#trunk/kryonet/examples/com/esotericsoftware/kryonet/examples/chat
To structure your gameplay, the server keeps the state of the game. To start, it probably shuffles some cards, and gives each player some cards. After setting up the state, you probably want to send a StartGame object to each player, eg so the client knows what cards are in their hand.
You generally don’t want to send information the client doesn’t need to know. Eg, if the player has some face down cards and they aren’t supposed to know what they are, don’t send what the cards are until the player draws them. If you do, someone could hack the client to make those cards always visible. By not sending the hidden information, you prevent cheating. That said, if you don’t care to worry about preventing cheating (eg you are playing with friends) then if it makes development easier to send hidden information, go ahead.
After sending StartGame, the server might send a StartTurn object to each player. It would have “int turnPlayerID” which is the ID of the player with the current turn. Each client would disable most of their UI so they can’t play cards and highlight the current turn player. The client with the turnPlayerID would enable its UI and allow the user to play a card (or whatever). The client would then send a PlayCard object to the server with the necessary identifying information.
When the server receives a PlayCard object it should check to make sure it is from the current turn player. Then it determines any actions necessary when the card is played and sends objects to the clients so they can update their UIs. It then sends the next player a StartTurn message (assuming the first player is done).
Because your game is turn based, you could support persisting the state of the game between turns. If a connection is lost or all the players otherwise leave, the server could hold on to the game state. When the players come back, the StartGame object would restore the game to how it was before, rather than to a new game state.
You could take this even further to make your turn based game playable on mobile phones. The server is exactly the same except instead of having persistent connections, you could do the communication over something like HTTP. This way the clients are normally not connected and they poll for updates. I have a project for that too, also based on Kryo so you can send objects over HTTP, and it works on the desktop and Android:
http://code.google.com/p/legion/
You might want to structure your server to handle multiple games at once. Eg, you could have a lobby where players go when they first connect. They organize and start a game from there, are removed from the lobby, and then the game code runs just for those players. This way not all players are in the same game, and the server can be hosting multiple games. Building a lobby is a bit boring though, so you might want to add this after your game works. Then again, if you are just going to play with friends you may not care to host more than one game per server.
Here is an online multiplayer card game that uses KryoNet:
http://www.ttafo.com/afo.html