1

私は現在、チャットプログラムに取り組んでいます。1 つのフォーム (MainWindow)と 1 つのクラス (TCPServerConnector ) が含まれています。MainWindow は、2 つのテキスト ボックス、2 つのボタン、および 1 つのリスト ボックスを含む UI です。

最初のテキスト ボックスに、接続するサーバーの IP を入力する必要があります。[接続] ボタンをクリックする必要があります。2 番目のテキストボックスには書かれたテキストが含まれ、2 番目のボタンはこのテキストを送信します。リストボックスには、プログラムがサーバーから受信したすべてのチャット/テキストが表示されるはずですが、機能しません。

Main-Form は TCPServerConnector のオブジェクトを初期化し、それに IP とテキストを渡します。しかし、テキストを受け取る時点になると、クラスは受け取ったテキストをフォームに渡す必要があります。

私は問題を解決しなかったデリゲートを使用しようとしました(以前は使用したことがありません)。クロススレッドに関するいくつかの例外がありました..

Main-Form の古いインスタンスを参照していないため、MainWindow の新しいインスタンスも作成します。

以下のクラスのコードを追加しました。誰かが私の問題を処理できることを願っています;)


メインフォーム:

public partial class MainWindow : Form
{

    public MainWindow()
    {
        InitializeComponent();
    }

    TCPServerConnector TestConnection = new TCPServerConnector();

    private void Form1_Load(object sender, EventArgs e)
    {
    }

    private void srvConnect_Click(object sender, EventArgs e)
    {
        TestConnection.ConnectToServer(srvConnectionIP.Text.ToString());
    }

    private void srvSend_Click(object sender, EventArgs e)
    {
        TestConnection.SendEnteredString(srvTextToSend.Text.ToString());
    }

    private void FormMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        TestConnection.CloseConnection();
    }
}

メソッド "OnRecievedData" に、受信したテキストを表示するメッセージ ボックスを追加しました。今のところ、これをフォーム リスト ボックスに追加することができないためです。

TCPServerConnector クラス:

class TCPServerConnector
{
    private Socket m_sock;
    private byte[] m_byBuff = new byte[256];

    public void ConnectToServer(string ServerAddress)
    {
        try
        {
            if (m_sock != null && m_sock.Connected)
            {
                m_sock.Shutdown(SocketShutdown.Both);
                System.Threading.Thread.Sleep(10);
                m_sock.Close();
            }

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

            IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(ServerAddress), 399);

            m_sock.Blocking = false;
            AsyncCallback onconnect = new AsyncCallback(OnConnect);
            m_sock.BeginConnect(epServer, onconnect, m_sock);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void OnConnect(IAsyncResult ar)
    {
        Socket sock = (Socket)ar.AsyncState;

        try
        {
            if (sock.Connected)
                SetupRecieveCallback(sock);
            else
                MessageBox.Show("Unable to establish connection");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void OnRecievedData(IAsyncResult ar)
    {
        Socket sock = (Socket)ar.AsyncState;

        try
        {
            int nBytesRec = sock.EndReceive(ar);
            if (nBytesRec > 0)
            {
                string sRecieved = Encoding.ASCII.GetString(m_byBuff, 0, nBytesRec);
                MessageBox.Show(sRecieved); //TO SHOW IF SOMETHING HAPPENED. HERE IS MY PROBLEM
                SetupRecieveCallback(sock);
            }
            else
            {
                Console.WriteLine("Client {0}, disconnected", sock.RemoteEndPoint);
                sock.Shutdown(SocketShutdown.Both);
                sock.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void SetupRecieveCallback(Socket sock)
    {
        try
        {
            AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
            sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void SendEnteredString(string EnteredData)
    {
        if (m_sock == null || !m_sock.Connected)
        {
            MessageBox.Show("You have to be connected to send something.");
            return;
        }

        try
        {
            Byte[] byteDateLine = Encoding.ASCII.GetBytes(EnteredData.ToCharArray());
            m_sock.Send(byteDateLine, byteDateLine.Length, 0);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public void CloseConnection()
    {
        if (m_sock != null && m_sock.Connected)
        {
            m_sock.Shutdown(SocketShutdown.Both);
            m_sock.Close();
        }
    }
}
4

2 に答える 2