Winforms, вызывает и проблемная кнопка - PullRequest
0 голосов
/ 07 февраля 2011

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

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Button btn1 = new Button();
        btn1.Click += button1_Click;
    }
    StreamReader sr;
    StreamWriter sw;
    TcpClient connection;
    private void Form1_Load(object sender, EventArgs e)
    {
        connection = new TcpClient("127.0.0.1", 5000);
        sr = new StreamReader(connection.GetStream());
        sw = new StreamWriter(connection.GetStream());

    }

    private void button2_Click(object sender, EventArgs e)
    {

        Thread t2 = new Thread(Reader);
        t2.Start(connection);
    }

    string msg;
    public void Reader(object o)
    {

        TcpClient con = o as TcpClient;
        if (con == null)
            return;
        while (true)
        {
             msg = sr.ReadLine();

             Invoke(new Action(Output));
        }
    }

    public void Output()
    {
        ChatScreen.Text = msg;//set the message on the screen
    }
    string textinput;

    private void button1_Click(object sender, EventArgs e)
    {
        textinput = InputLine.Text;
        sw.WriteLine(textinput);// this thing, writes once, multiple clicks wont send a new line to the server :(..the problem is in this button
        sw.Flush();

    }


}

что я подумал сделать, это подключить кнопку, чтобы она могла делать несколько щелчков .. например, btn.Click () .. или запустить поток с вызовом на WriteLine (но моя интуиция говорит, что создание кнопки нажатие несколько раз заставит программу работать

Ответы [ 3 ]

1 голос
/ 07 февраля 2011

Вам нужно остановить процесс потока, когда вы закрываете форму, если нет, когда вы пытаетесь выполнить вызов, он потерпит неудачу, потому что форма удалена и ее нельзя использовать для вызова. Вы можете переопределить метод dispose, чтобы остановить поток чтения, или вы можете сделать это с помощью метода onclose. Или вы можете проверить процесс чтения, если элемент управления доступен (он не расположен) и если он недоступен, завершите процесс чтения.

Вы должны запретить запуск процесса считывателя несколько раз, чтобы избежать ошибок, поэтому вам нужно отключить кнопку при запуске потока.

Отредактировано:

Вы можете использовать что-то вроде следующего кода для чтения нескольких строк и остановки потока при закрытии формы.

   private bool mbIsRunning = true;

   private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
   {
      lock (this)
      {
         mbIsRunning= false;
      }
   }

   private bool IsRunning
   {
        get
        { 
            lock(this)
            {
                return mbIsRunning;
            }
        }
    }


    string msg;
    public void Reader(object o)
    {

        TcpClient con = o as TcpClient;
        if (con == null)
            return;
        while (IsRunning)
        {
             msg = reader.ReadLine(); 
             string line;
             while( (line = reader.ReadLine()) != null )
             {
                msg = msg + Enviroment.NewLine + line;
             }

             Invoke(new Action(Output));
        }
    }
0 голосов
/ 07 февраля 2011

Я делаю конкат на моем коде сервера:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener server = new TcpListener(IPAddress.Any, 5000);
            server.Start();
            Console.WriteLine("Server started");
            string word = "";
            savedObject saved = new savedObject();

            while (true)
            {
                TcpClient connection = server.AcceptTcpClient();
                Console.WriteLine("connection accepted");
                ThreadPool.QueueUserWorkItem(saved.ProssecClient, connection);
            }
        }
    }
}





class savedObject
{
    Dictionary<string, StreamWriter> dic = new Dictionary<string, StreamWriter>();
    StreamReader[] sr1 = new StreamReader[100];
    StreamWriter[] sw1 = new StreamWriter[100];
    string[] name = new string[100];
    int m;
    int a;
    int g;
    string word;

    public string AllWords(string sit)
    {
        word += sit + "  ";// here i concat them
        return word;
    }


    public string word2()
    {
        return word;
    }



    public void ProssecClient(object o)
    {


        TcpClient connection = o as TcpClient;
        if (connection == null)
        {
            return;
        }
        StreamReader sr = new StreamReader(connection.GetStream());
        StreamWriter sw = new StreamWriter(connection.GetStream());
        sr1[a++] = new StreamReader(connection.GetStream());
        sw1[m++] = new StreamWriter(connection.GetStream());
        string word2 = "";
        sw.WriteLine("Please, fill your name: ");
        name[g++] = sr.ReadLine();

        if (name[g] != null && sw1[m] != null)
        {
            dic.Add(name[g], sw1[m]);
        }
        try
        {
            while (true)
            {
                int i = 0;
                word2 = AllWords(sr.ReadLine());

                for (i = 0; i < 3; i++)
                {
                    if (sw1[i] != null)
                    {
                        sw1[i].WriteLine( name[i] + ":  " + word2);// here is the words that are sent..

                        sw1[i].Flush();

                    }

                }

            }
        }
        catch { Console.WriteLine("client left"); }
    }

}
0 голосов
/ 07 февраля 2011

Запустив ваш код, я получаю кучу ошибок - от TcpClient, вызывающего исключение и так далее.Однако, предполагая, что вы не опубликовали весь свой код, я бы порекомендовал сделать попытку ... перехватить все ваши функции и затем точки останова в перехвате, чтобы увидеть, в чем проблема.Изучите исключения - исключения должны создаваться только в исключительных обстоятельствах, поэтому ваш код должен действительно работать без этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...