Сетевое взамодействие
Вечера. Передо мной стоит задача разместить сервер на виртуальной машине, а клиент на хосте. Взаимодействие реализуется через TCPClient&TCPListener. На сервере при выборе порта 3389, на котором стоит удаленный сервер ВМ появляется ошибка о том, что разрешается использование одного адреса порта. Если взять другой порт, то все будет работать.
На клиенте же я выбираю порт 3389 и клиент соединяется с сервером, но при выполнении кода появляется ошибка:
Я предпринимал и менять порты и ip-адреса, даже зарезервировал часть портов, но всеравно ничего не вышло. Клиент
using TcpClient tcpClient = new TcpClient();
await tcpClient.ConnectAsync("192.168.56.104", 3389);
var stream = tcpClient.GetStream();
int bytesRead = 10;
var response = new List<byte>();
bool flag = true;
List<NoteView> notes = new List<NoteView>();
string json_string = string.Empty;
int code = 0;
while (flag)
{
flag = Menu.MainMenu(out json_string, notes, out code);
if(code != -1)
{
byte[] data = Encoding.UTF8.GetBytes(json_string + '\n');
// отправляем данные
await stream.WriteAsync(data);
// считываем данные до конечного символа
while ((bytesRead = stream.ReadByte()) != '\n')
{
// добавляем в буфер
response.Add((byte)bytesRead);
}
var translation = Encoding.UTF8.GetString(response.ToArray());
Menu.OutputMenu(out notes, translation);
response.Clear();
}
}
// отправляем маркер завершения подключения - END
await stream.WriteAsync(Encoding.UTF8.GetBytes("END\n"));
Сервер
var tcpListener = new TcpListener(IPAddress.Any,3388);
try
{
tcpListener.Start(); // запускаем сервер
Console.WriteLine("Сервер запущен. Ожидание подключений... ");
while (true)
{
// получаем подключение в виде TcpClient
var tcpClient = await tcpListener.AcceptTcpClientAsync();
// создаем новую задачу для обслуживания нового клиента
_ = Task.Run(async () => await ProcessClientAsync(tcpClient));
// вместо задач можно использовать стандартный Thread
// new Thread(async ()=>await ProcessClientAsync(tcpClient)).Start();
}
}
finally
{
tcpListener.Stop();
}
// обрабатываем клиент
async Task ProcessClientAsync(TcpClient tcpClient)
{
NoteController noteController = new NoteController();
var stream = tcpClient.GetStream();
// буфер для входящих данных
var response = new List<byte>();
int bytesRead = 0;
string translate = "";
while (true)
{
// считываем данные до конечного символа
while ((bytesRead = stream.ReadByte()) != '\n')
{
// добавляем в буфер
response.Add((byte)bytesRead);
}
var word = Encoding.UTF8.GetString(response.ToArray());
// если прислан маркер окончания взаимодействия,
// выходим из цикла и завершаем взаимодействие с клиентом
if (word == "END") break;
var resp = await noteController.Controller(word, tcpClient);
translate = JsonSerializer.Serialize(resp);
// добавляем символ окончания сообщения
translate += '\n';
// отправляем перевод слова из словаря
await stream.WriteAsync(Encoding.UTF8.GetBytes(translate));
response.Clear();
}
tcpClient.Close();
}
Подскажите решение, так как данная проблема не позволяет решить задачу.