I have looked through a lot of questions/answers related to my problem, but I couldn't fix it though.
My issue is about sending data(Strings in this example) through socket.
I have a Server
class:
class Server
{
Socket sock;
Socket serverSock;
byte[] buffer;
string serverMsg;
string clientMsg;
int bytesRead;
public void start()
{
buffer = new byte[1024];
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7777));
sock.Listen(5);
Console.WriteLine("Listening ---------------------");
serverSock = sock.Accept();
Console.WriteLine("Client accepted--------------------");
//welcome message
serverMsg = "WELCOME TO THE SERVER";
buffer = ASCIIEncoding.Default.GetBytes(serverMsg);
serverSock.Send(buffer);
Console.WriteLine("Server message: " + ASCIIEncoding.Default.GetString(buffer));
Array.Clear(buffer, 0, buffer.Length);
//response message
while ((bytesRead = serverSock.Receive(buffer)) > 0)
{
clientMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
Array.Clear(buffer, 0, buffer.Length);
}
Console.WriteLine("Client response: " + clientMsg);
//Begin receiving user input from client
while (true)
{
while ((bytesRead = serverSock.Receive(buffer)) > 0)
{
clientMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
Array.Clear(buffer, 0, buffer.Length);
}
Console.WriteLine("Client message: " + clientMsg);
//server response to user input
serverMsg = clientMsg.Replace('b', 'p');
buffer = ASCIIEncoding.Default.GetBytes(serverMsg);
serverSock.Send(buffer);
Console.WriteLine("Server message: " + ASCIIEncoding.Default.GetString(buffer));
Array.Clear(buffer, 0, buffer.Length);
}
}
}
And a client
class:
class Client
{
Socket socketClient;
string serverMsg;
string clientMsg;
byte[] buffer;
int bytesRead;
public void start()
{
buffer = new byte[1024];
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7777));
Console.WriteLine("Client connected-------------------");
//receive welcome message from server
while ((bytesRead = socketClient.Receive(buffer)) > 0)
{
serverMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
Array.Clear(buffer, 0, buffer.Length);
}
Console.WriteLine("Server message: " + serverMsg);
//response message
clientMsg = "THANK YOU FOR YOUR GREETINGS";
buffer = ASCIIEncoding.Default.GetBytes(clientMsg);
socketClient.Send(buffer);
Console.WriteLine("Client message: " + ASCIIEncoding.Default.GetString(buffer));
Array.Clear(buffer, 0, buffer.Length);
//Begin sending user input
while (true)
{
clientMsg = Console.ReadLine();
buffer = ASCIIEncoding.Default.GetBytes(clientMsg);
socketClient.Send(buffer);
Console.WriteLine("Client message: " + ASCIIEncoding.Default.GetString(buffer));
Array.Clear(buffer, 0, buffer.Length);
while ((bytesRead = socketClient.Receive(buffer)) > 0)
{
serverMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
Array.Clear(buffer, 0, buffer.Length);
}
Console.WriteLine("Server response: "+serverMsg);
Array.Clear(buffer, 0, buffer.Length);
}
}
}
When I run my program I get the following outputs:
****Server output:** **
> Listening ---------------------
> Client accepted--------------------
> Server message: WELCOME TO THE SERVER
****Client output:** **
> Client connected-------------------
I know that my client is infinitely stuck in the loop that receives buffers.
*So how can I break from that loop ensuring that I receive the complete message?
*And is there a better (more general) approach for sending/receiving different data types through sockets?
Thank You