Клиент подключается к серверу, отправляет ему любое сообщение и в ответ получает длинную строку. Код чтения ответа:
byte[] buffer = new byte[1024];
int bytesRead = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Answer: {msg}");
Понятно, что так он примет только первые 1024 байта. Как получить весь ответ, не увеличивая размер буфера? По-идее, цикл нужен. Но цикл виснет после нескольких итераций.
Код цикла:
while (true)
{
byte[] buffer = new byte[1024];
int bytesRead = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (bytesRead == 0)
{
Console.WriteLine("zero");
break;
}
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Answer: {msg.Length}");
}
Сервер:
namespace Server
{
internal class Program
{
static void Main(string[] args)
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 5555);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(endPoint);
server.Listen(1);
while (true)
{
Socket client = server.Accept();
Console.WriteLine($"{client.RemoteEndPoint} is connected");
while (true)
{
try
{
byte[] buffer = new byte[1024];
int bytesRead = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (bytesRead == 0)
{
Console.WriteLine($"{client.RemoteEndPoint} is disconnected");
client.Shutdown(SocketShutdown.Both);
break;
}
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine(msg);
string answer;
string fn = "info.json";
if (File.Exists(fn))
{
answer = File.ReadAllText(fn);
}
else
{
answer = "fuck off";
}
SendMessage(client, answer);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine($"{client.RemoteEndPoint} is disconnected");
client.Shutdown(SocketShutdown.Both);
break;
}
}
}
server.Shutdown(SocketShutdown.Both);
}
private static void SendMessage(Socket client, string msg)
{
byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
client.Send(msgBytes);
}
}
}
Клиент:
namespace Client
{
internal class Program
{
static void Main(string[] args)
{
string ip = "127.0.0.1";
int port = 5555;
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(ip, port);
if (client.Connected)
{
while (true)
{
string s = Console.ReadLine();
if (s == "")
{
break;
}
byte[] bytes = Encoding.UTF8.GetBytes(s);
client.Send(bytes);
byte[] buffer = new byte[1024];
int bytesRead = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Answer: {msg}");
}
client.Disconnect(false);
}
client.Shutdown(SocketShutdown.Both);
}
}
}