私は現在、チャットプログラムに取り組んでいます。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();
}
}
}