Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 15:22   #1
Корделия
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 21
По умолчанию Потоки,Клиент-Сервер

Тема потоков что-то вообще с трудом дается. (((

Пишу клиент-серверное приложение. Сервер должен принять сообщение и вывести его в richTextBox1, или же если происходят ошибки то они выведутся в toolStripStatusLabel1. я так понимаю, этот вывод будет происходить в другом потоке....но как это сделать я не понимаю. к тому же что обращаться к toolStripStatusLabel1,richTextBox1 напрямую нельзя пишет ошибку :
{ Ошибка 1 Для нестатического поля, метода или свойства "server.Form1.toolStripStatusLabel1 " требуется ссылка на объект C:\..\server\Form1.}

прилагаю код
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace server
{

    public delegate void deleg(string S);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread Server = new Thread(new ThreadStart(StartListening));
            Server.IsBackground = true;
            Server.Start();
        }

        public void Metod(string s)
        {
            richTextBox1.Text = s+ "\r\n";
        }

        public void Metod2(string s)
        {
            toolStripStatusLabel1.Text = s;
        }


        public static string data = null;

        public static void StartListening()
        {
            byte[] bytes = new byte[1024];


            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 44000);


            Socket listener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);


            Thread Server = new Thread(new ThreadStart(StartListening));
            Server.IsBackground = true;
            Server.Start();


            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(10);


                while (true)
                {
                    //Моя тщетная попытка что то сделать......
                    Thread Er = new Thread(new ThreadStart(Form1.Metod2("Waiting for a connection...")));
                    Er.IsBackground = true;
                    Er.Start();

                    //toolStripStatusLabel1.Text = "Waiting for a connection...";


                    Socket handler = listener.Accept();
                    data = null;

                    while (true)
                    {
                        bytes = new byte[1024];
                        int bytesRec = handler.Receive(bytes);
                        data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                        if (data.IndexOf("<EOF>") > -1)
                        {
                            break;
                        }
                    }

                    //toolStripStatusLabel1.Text ="Text received : " + data;

                    byte[] msg = Encoding.ASCII.GetBytes(data);

                    handler.Send(msg);
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }

            }
            catch (Exception e)
            {
                // toolStripStatusLabel1.Text=e.ToString();
            }


        }
    }
}

Последний раз редактировалось Stilet; 07.04.2013 в 12:35.
Корделия вне форума Ответить с цитированием
Старый 07.04.2013, 10:50   #2
iukash
учу английский...
Форумчанин
 
Аватар для iukash
 
Регистрация: 04.04.2009
Сообщений: 480
По умолчанию

Глядя на пост с телефона, могу сказать одно, по поводу той ошибки, о которой вы написали: - из вызванного потока доступ к объектам вызывающего осуществляется через Dispacher.Invoke(тут ваще действие с объктом или делегат).
А еще мне на глаз не нравится реализация функции StartListening.
В общем пишите, если проблема еще актуальна, разберу ваш код по основательнее.
"Мы можем что-то изменить и своими силами..."
"Начнешь с себя, примером ближнему поможешь..."
iukash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент-сервер, потоки, загвоздка в постоянном чтении и отправке сообщений. Чиффа Общие вопросы C/C++ 9 25.09.2012 17:05
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18