Клиент-серверное приложение. Передача строки без потери данных - C#
Формулировка задачи:
Помогите реализовать передачу данных между клиентом и сервером. Сейчас использую данный код. Но проблема в том что при передаче строки более 500 символов иногда возникают ошибки с получением всей строки.
//Клиент
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketTcpClient
{
class Program
{
static void Main(string[] args)
{
int i = 20;
while (true)
{
try
{
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.150"), 12000);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// подключаемся к удаленному хосту
socket.Connect(ipPoint);
i++;
string message = GetRandomString(i);
byte[] data = Encoding.Unicode.GetBytes(message);
socket.Send(data);
// получаем ответ
data = new byte[16]; // буфер для ответа
StringBuilder builder = new StringBuilder();
int bytes = 0; // количество полученных байт
do
{
bytes = socket.Receive(data, data.Length, 0);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (socket.Available > 0);
if(Convert.ToInt64(builder.ToString()) == message.Length)
{
Console.WriteLine("OK " + message.Length);
}
else
{
Console.WriteLine("NOT");
Console.WriteLine(message);
Console.ReadKey();
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public static string GetRandomString(int L)
{
var allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
var length = L;
var chars = new char[length];
var rd = new Random();
for (var i = 0; i < length; i++)
{
chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
}
return new String(chars);
}
}
}//Сервер
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketTcpServer
{
class Program
{
static void Main(string[] args)
{
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 12000);
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
listenSocket.Bind(ipPoint);
listenSocket.Listen(10);
Console.WriteLine("Сервер запущен. Ожидание подключений...");
while (true)
{
Socket handler = listenSocket.Accept();
// получаем сообщение
StringBuilder builder = new StringBuilder();
int bytes = 0; // количество полученных байтов
byte[] data = new byte[16]; // буфер для получаемых данных
do
{
bytes = handler.Receive(data);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (handler.Available > 0);
string Message = builder.ToString();
Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + Message);
// отправляем ответ
string message = Message.Length.ToString();
data = Encoding.Unicode.GetBytes(message);
handler.Send(data);
// закрываем сокет
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}Решение задачи: «Клиент-серверное приложение. Передача строки без потери данных»
textual
Листинг программы
// получаем сообщение
StringBuilder builder = new StringBuilder();
Decoder decoder = Encoding.Unicode.GetDecoder();
byte[] data = new byte[16]; // буфер для получаемых данных
char[] charData = new char[data.Length];
do
{
int bytes = handler.Receive(data);
int charCount = decoder.GetChars(data, 0, bytes, charData, 0);
builder.Append(charData, 0, charCount);
}
while (handler.Available > 0);
string Message = builder.ToString();
Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + Message);