Сокеты

iosif88

Well-known member
14.10.2009
97
1
#1
Итак, стоит следующая задача есть сервер который должен принимать строки от клиента, обрабатывать их и возвращать ему. Вопрос как правильно организовать это взаимодействие чтоб это было надежно. Скажем есть такой код:

Сервер:

Код:
			listener = new TcpListener(9050);
listener.Start();
Socket socket = null;
while (true)
{
try
{
listener.Start();
socket = listener.AcceptSocket();
string answer = "";
int brec = socket.Receive(buffer);

string msg = Encoding.ASCII.GetString(buffer, 0, brec);

if (msg != "")
{
answer = OFSReq(msg); //здесь строка обрабатывается 
}
else
{
answer = "Wrong String"; 
}

byte[] answ = Encoding.ASCII.GetBytes(answer);
socket.Send(answ);
}
catch (Exception Exp)
{
/*byte[] answ = Encoding.ASCII.GetBytes(Exp.Message);
socket.Send(answ);*/
WriteExpLog(Exp.Message);

}
finally
{
socket.Close();
}
Клиент

Код:
		  IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
server.Connect(IPAddress.Parse("127.0.0.1"), 9050);

byte[] buffer = new Byte[1024];
string message = textBox1.Text;
buffer = Encoding.ASCII.GetBytes(message);
byte[] answer = new Byte[1024];
server.Send(buffer);
int received = server.Receive(answer);
if (received < 0 )
{
richTextBox1.AppendText("Read failed \n");
server.Close();
return;
}
richTextBox1.AppendText(Encoding.ASCII.GetString(answer, 0, answer.Length) + "\n");


}
catch (Exception exp) 
{
richTextBox1.AppendText(exp.Message + "\n");
}
finally 
{
server.Close();
}
Проблема в данном случае что при потпытке послать пустую строку всё "замораживается".

Это лишь пример, а в общем хотелось бы понять как нужно правильно организовать это взаимодействие, чтоб всё работало надежно, не зависимо от того что происходит на стороне клиента. Какой должен быть общий алгоритм сервера? Где и какие исключения нужно обратывать? Нужно ли при слишком долгом ожидании клиента отключать его от сервера и как это сделать (чтоб сервер заново мог принимать сообщения)?

Думаю тема была бы полезна не только мне. Если у вас есть ссылка на подобно рода материалы поделитесь.
 
Y

Young Programmer

#2
для взаимодействия клиент-сервер посоветовал бы использовать WCF. Простых примеров передачи строк в интернете хватает, не нужно заморачиваться с сокетами всякими.