Let's say, I give you an oppotunity to do by yourself.
You need to solve this problem by yourself because you are the boss of yourself.
If I do all project for you, this means you cheat on yourself. Don't you ??...
This is too many way to do a lot of things.
But you're lucky, because you have all stream / text transaction instruments.
Just you need to use it and improve the protocol.
(1) The both server and client sides, I fixed too many code. Firstly you need to cover them in your mind.
(2) When a user connected or disconnected, I put the
SendClientsList procedure after transaction to renew the client lists you will see if you look that. You need to focus on that to your question. Client side, firstly the ListView Items cleared you see. This is why the user(s) state lost. Make a trick shot to save them. For example you may ping and refresh all user for last state like userlist thing or you also save the states on server's listview and refresh from that listview ext ext too many ways to do this easily.
(I also fixed send message to the user spesific. If UniqueID parameter equals (0) then the message will boradcast all users.)
--- after all working ---
(3) For images, you need a cache or temp folder to save images every client. Why? Because all the images saved to this folder to reduce the network traffic by image send/receive..
(4) If source image not exists or date-time information changed by local temp one, after then you download the image for user. This will speedup transaction.
(5) All images also must be on the server side.
(6) in my opinion all user must be sign up. Then you will make a database for this. I gave you example before. You must embed that technique to your project.
(7) After this database creation, you will also have a oppotunity to send offline messages if you want.
You have too many way and much work to finish this project you see.

You must work work work very much...
