Member 14851077 Ответов: 1

Как я могу решить эту проблему программирования на C#?


У меня есть небольшой сервер, который принимает и отправляет сообщение обратно клиенту.
это клиентская сторона
когда я открою клиент он подключится к серверу через Connect()
public Form1()
        {
            InitializeComponent();
            Connect();
            CheckForIllegalCrossThreadCalls = false;
        }

это моя связь
void Connect()
        {
            ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                server.Connect(ipep);
            }
            catch (SocketException e)
            {
                MessageBox.Show(Convert.ToString(e));           
            }
            Thread listen = new Thread(Receive);
            listen.IsBackground = true; ;
            listen.Start();
        }

и у меня есть такой прием
void Receive()
        {
            datarec = new byte[1024];
            try
            {
                while (true)
                {
                    string StringData;
                    rec = server.Receive(datarec);
                    StringData = Encoding.ASCII.GetString(data, 0, rec);
                    txtShow.Text = StringData;
                }
            }
            catch
            {
                Close();
            }
        }

и я посылаю данные через кнопку Отправить способ
void Send(string s)
        {
            data = new byte[1024];
            data = Encoding.ASCII.GetBytes(s);
            server.Send(data, data.Length, SocketFlags.None);
            
        }

это серверная часть
у меня есть потоковый сервер
public static void Process(Socket client)
        {
            byte[] data = new byte[1024];
            int recv;
            string dataInput;
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);             
            
            while (true)
            {
                try
                {                   
                     recv = client.Receive(data);
                    dataInput = Encoding.ASCII.GetString(data, 0, recv);
                    Console.WriteLine(dataInput);
                    client.Send(data);
                }
                catch (SocketException e)
                {

                    Console.WriteLine(e);
                }
            }
        }

сервер получает сообщение, но когда он отправляет сообщение обратно, он имеет ошибку "существующее соединение было принудительно закрыто удаленным хостом"
Ребята, не могли бы вы сказать мне, где я ошибся и как я могу это исправить?
Извините, что пропустил кнопку "Отправить". Вот оно
private void button1_Click(object sender, EventArgs e)
        {
            string s = txtText.Text;
            Send(s);          
        }


Что я уже пробовал:

Я искал эту ошибку в течение 2 дней, но до сих пор не понимаю, как ее исправить. Можете ли вы, ребята, сказать мне или дать мне источник, где я могу найти, как это исправить ? большое спасибо

1 Ответов

Рейтинг:
2

OriginalGriff

Посмотрите на свой код:
Вы пытаетесь вызвать Recieve из двух разных потоков:
Один раз, когда вы устанавливаете сокет:

void Connect()
        {
            ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
...
            Thread listen = new Thread(Receive);
            listen.IsBackground = true; ;
            listen.Start();
        }

И один раз каждый раз, когда вы пытаетесь отправить данные:
void Send(string s)
        {
            data = new byte[1024];
            data = Encoding.ASCII.GetBytes(s);
            server.Send(data, data.Length, SocketFlags.None);
            Receive();
        }
Вы не показываете нам, куда отправляются клиентские вызовы, но у вас не может быть двух "слушателей" на одном сокете - система не будет знать, где ее обрабатывать.
Таким образом, есть вероятность, что каждый раз, когда вы вызываете Send, он вызывает исключение, и вы вызываете Close, чтобы завершить работу клиента.

И тогда сервер не имеет конечной точки для ответа ... таким образом, сервер также терпит неудачу.


Member 14851077

спасибо за ваш комментарий. Я обновил его и удалил второй Receive() тоже. Но у него все еще есть новая ошибка "установленное соединение было прервано программным обеспечением на вашем хост-компьютере"

OriginalGriff

Ну, вам потребовалось 2 дня, чтобы не заметить этого, так что я бы предположил, что вы делаете что - то столь же глупое в другом месте вашего кода-поэтому вам нужно пройти через все ваше клиентское и серверное программное обеспечение с тонкой зубчатой расческой и выяснить, что именно вы делаете и как это может повлиять на вас.

Мы не можем этого сделать - у нас нет доступа к вашему коду, только фрагменты, которые вы вставляете сюда. И вы написали его, так что вы знаете, чего вы ожидаете от него, а мы нет!

Member 14851077

извините за ваш гнев, но второй прием () - это ошибка. Я написал его там для проверки проблемы, но не могу решить. Затем я переписал первый Receive() и забыл удалить второй. Извините, что не проверил, прежде чем отправить его сюда

OriginalGriff

Я не сержусь - черт возьми, я даже не раздражаюсь! :смеяться:

Но я серьезно: вы должны проверить свой код - все это - и посмотреть, что вы делаете, и мы не можем сделать это за вас!

Member 14851077

спасибо за ваш совет, я не забуду проверить свой код, прежде чем надевать его

OriginalGriff

Не просто проверяйте свой код перед публикацией, проверьте все это прямо сейчас!