Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Чат по локальной сети: при запуске второй копии кл


Автор: Iostrеam 29.1.2012, 18:29
Написал клиент-серверный чат, который передает сообщения по локальной сети, на wpf
Вот код сервера:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace server
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Thread Access = new Thread(new ThreadStart(getaccess));
            Access.IsBackground = true;
            Access.Start();
        }

        private void getaccess()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("10.5.24.11"), 2002);
            listener.Start();
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                StreamReader sr = new StreamReader(client.GetStream());
                Execute(sr.ReadLine());
                client.Close();
            }
        }

        private void send(string message)
        {
            TcpClient client = new TcpClient();
            try
            {
                client.Connect(IPAddress.Parse("10.5.24.11"), 2001);
                StreamWriter sw = new StreamWriter(client.GetStream());
                sw.AutoFlush = true;
                sw.WriteLine(message);
            }
            catch
            {
                MessageBox.Show("Ошибка при подключении к Client.exe server");
            }
            client.Close();
        }

        private void Execute(string data)
        {
            Dispatcher.Invoke((Action)(() => this.textBox1.Text = data));
            send(data);
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            send(textBox1.Text);
        }
    }
}


Вот код клиента:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace client1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Thread Access = new Thread(new ThreadStart(getaccess));
            Access.IsBackground = true;
            Access.Start();
        }

        private void getaccess()
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("10.5.24.11"), 2001);
            listener.Start();
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                StreamReader sr = new StreamReader(client.GetStream());
                Execute(sr.ReadLine());
                client.Close();
            }
        }

        private void send(string message)
        {
            TcpClient client = new TcpClient();
            try
            {
                client.Connect(IPAddress.Parse("10.5.24.11"), 2002);
                StreamWriter sw = new StreamWriter(client.GetStream());
                sw.AutoFlush = true;
                sw.WriteLine(message);
            }
            catch
            {
                MessageBox.Show("Ошибка при подключении к Client.exe");
            }
            client.Close();
        }

        private void Execute(string data)
        {
            Dispatcher.Invoke((Action)(() => this.textBox2.Text = data));
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            send(textBox1.Text);
        }
    }
}


C одной программой-клиентом все нормально, но когда запускаю вторую копию клиента выводит исключение в строке
Код

listener.Start();


С сообщением:
"Необработанное исключение типа "System.Net.Sockets.SocketException" произошло в System.dll

Дополнительные сведения: Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)"

Как исправить эту ошибку? Чтобы программа-сервер могла обмениваться сообщениями с несколькими программами-клиентами по локальной сети?

Автор: Partizan 13.2.2012, 16:21
Код

            TcpListener listener = new TcpListener(IPAddress.Parse("10.5.24.11"), 2001);

            try
            {                                             
               listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);               
            }
            catch (SocketException)
            {
               //Failed to share port
            }     

            listener.Start();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)