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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2010, 16:53   #1
divers
 
Регистрация: 17.04.2010
Сообщений: 7
По умолчанию Потоки и сокеты

Сразу к коду:
Код:
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.IO;
using System.Net.Sockets;
using System.Threading;


namespace tcpclient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        TcpClient client = new TcpClient();
       

        private void сетьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form _MyForm=new Form2();
            _MyForm.ShowDialog();
        }

        private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ipadress;
            int port;
            try
            {
                StreamReader ip = new StreamReader("c://ip.txt"); //считываем из файла введенный IP и порт
                ipadress = ip.ReadLine();

                StreamReader pt = new StreamReader("c://pt.txt"); //считываем из файла введенный IP и порт
                port = Convert.ToInt32(pt.ReadLine());
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("ошибка чтения из файла");
                return;
            }

            try
            {
                client.Connect(ipadress, port);// пробуем присоединиться к серверу
            }
            catch
            {
            
              System.Windows.Forms.MessageBox.Show("Ошибка подключения." +"  IP:"+ipadress+ "  Порт:"+port);
              return;
            }
            System.Windows.Forms.MessageBox.Show("Удачное подключение" +"  IP:"+ipadress+ "  Порт:"+port);
            //Здесь хотелось бы запускать поток который ожидает получения сообщений от сервера.( Recdate)
        }

        public void Recdate(object Sock)
    {
        byte[] remdata = { }; // Данные с сервера
        while (client.Connected)
        {
        Sock.Receive(remdata);
        richTextBox2.Text = "<<" + " " + Encoding.ASCII.GetString(remdata) + richTextBox2.Text;
        }
    }

         public void button2_Click(object sender, EventArgs e) //отправка сообщения на сервер
        {

            Socket Sock = client.Client;

            if (client.Connected)
            {
                Sock.Send(Encoding.ASCII.GetBytes(richTextBox1.Text));
                richTextBox2.Text = ">>" + " " + richTextBox1.Text + richTextBox2.Text ;
                richTextBox1.Text = "";
                Thread t = new Thread(Recdate);
                t.Start(Sock);

            }
            else
            {
                System.Windows.Forms.MessageBox.Show("установите соединение с сервером");
                return;
            }
        }

         private void EnterSend(object sender, KeyEventArgs e) 
         {
             if (e.KeyCode == Keys.Enter)
                 button2_Click(sender, e);
         }
    }
}
И так, что хочется сделать:
- По присоединению к серверу сразу запускать поток, который ожидает получения сообщений от сервера, и при получении его выводить на richTextbox2;

Почему не получается сделать:
- Не знаю как передать в поток переменную Sock которая создается по клику на Button2 ( Socket Sock = client.Client;
- Не знаю можно ли 2м потокам одновременно использовать один сокет, или же их надо как то синхронизировать, то есть если получаем сообщение, то основной отсылать в этот момент нельзя, то есть основной поток надо усыпить и наоборот.

C# изучаю 2 недели, так что если это возможно подскажите наиболее простыми словами), с примером реализации, заранее спасибо.
divers вне форума Ответить с цитированием
Старый 18.04.2010, 12:08   #2
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Ну у меня это было реализоавнно примерно так:
обявлялся сокет... создавался поток который ждал сообщения и отправллял в техтбукс.... когда я чтот вводил из другово текст букса...и отправлял... как я понимал сообщение встает в очередь и отправляеться когда дождеться своей очереди...
Проблем не наблюдал...
dampirik вне форума Ответить с цитированием
Старый 18.04.2010, 13:29   #3
divers
 
Регистрация: 17.04.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от dampirik Посмотреть сообщение
Ну у меня это было реализоавнно примерно так:
обявлялся сокет... создавался поток который ждал сообщения и отправллял в техтбукс.... когда я чтот вводил из другово текст букса...и отправлял... как я понимал сообщение встает в очередь и отправляеться когда дождеться своей очереди...
Проблем не наблюдал...
Как заставить не главный поток работать с richTextBoxом? Он же его не видит
divers вне форума Ответить с цитированием
Старый 18.04.2010, 15:08   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Dispatcher.BeginInvoke(() => RichBox.....);
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сокеты в С TDrive C/C++ Сетевое программирование 6 03.03.2010 11:59
Сокеты Pelengeist Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 19.11.2009 11:09
Сокеты Pavelok Работа с сетью в Delphi 3 16.09.2009 16:57
Сокеты ben95 Общие вопросы Delphi 7 09.03.2008 23:26
сокеты cross Работа с сетью в Delphi 2 21.12.2006 18:12