【问题标题】:Creating a client app for chat in WinForms在 WinForms 中创建用于聊天的客户端应用程序
【发布时间】:2017-05-05 16:10:17
【问题描述】:

我正在尝试用 C# WinForms 创建简单的聊天。

        TcpClient client;
        public MainWindow()
        {
          InitializeComponent();
          client = new TcpClient("192.168.0.100", 1234);
          AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
          ReadAsync(client,logbox);
        }

    private void sendButton_Click(object sender, EventArgs e)
            {
        string text = textBox.Text;
        byte[] data = Encoding.ASCII.GetBytes(text);
        NetworkStream stream  = client.GetStream();
        stream.Write(data,0,text.Length);
    }
    static async void ReadAsync(TcpClient client, RichTextBox box)
    {
        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[1024];
        while (true)
        {
            await stream.ReadAsync(buffer, 0, 1024);
            box.AppendText(Encoding.ASCII.GetString(buffer));
        }
    }
    private void MainWindow_Load(object sender, EventArgs e)
    {

    }
    void OnProcessExit(object sender, EventArgs e)
    {
        client.Close();
    }

sendButton_Click 有问题,发送功能不起作用。 我认为,它正在等待 stream.Close();发送数据,但我需要这个流来接收数据。

【问题讨论】:

  • 这会抛出异常吗?
  • 上面的代码没有明显的问题。所以无论你有什么问题,它都在你没有分享的代码中。您的问题需要包含一个好的minimal reproducible example,它可以可靠地重现问题。对于网络代码,这意味着您需要为客户端和服务器都包含minimal reproducible example。此外,您需要提供比 “不工作” 更具体的问题陈述。
  • 调试器什么也没显示。我的服务器端:
  • 我前段时间创建了类似的东西:github.com/PieterjanDeClippel/Chatprogramma35。它支持具有双向流的多个客户端

标签: c# winforms client client-server


【解决方案1】:

你应该使用 Sockets,这是一个简单的 winforms 聊天示例:

服务器:

using System;
using System.Threading;
using System.Net.Sockets;
using System.Text;
using System.Collections;

namespace ChatServer
{
    class Program
    {
        public static Hashtable clientsList = new Hashtable();

        static void Main(string[] args)
        {
            TcpListener serverSocket = new TcpListener(8888);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;

            serverSocket.Start();
            Console.WriteLine("Chat Server Started ....");
            counter = 0;
            while ((true))
            {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();

                byte[] bytesFrom = new byte[1000025];
                string dataFromClient = null;

                NetworkStream networkStream = clientSocket.GetStream();
                networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));

                clientsList.Add(dataFromClient, clientSocket);

                broadcast(dataFromClient + " Joined ", dataFromClient, false);

                Console.WriteLine(dataFromClient + " Joined chat room ");
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, dataFromClient, clientsList);
            }

            clientSocket.Close();
            serverSocket.Stop();
            Console.WriteLine("exit");
            Console.ReadLine();
        }

        public static void broadcast(string msg, string uName, bool flag)
        {
            foreach (DictionaryEntry Item in clientsList)
            {
                TcpClient broadcastSocket;
                broadcastSocket = (TcpClient)Item.Value;
                NetworkStream broadcastStream = broadcastSocket.GetStream();
                Byte[] broadcastBytes = null;

                if (flag == true)
                {
                    broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg);
                }
                else
                {
                    broadcastBytes = Encoding.ASCII.GetBytes(msg);
                }

                broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
                broadcastStream.Flush();
            }
        } 
    }


    public class handleClinet
    {
        TcpClient clientSocket;
        string clNo;
        Hashtable clientsList;

        public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            this.clientsList = cList;
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }

        private void doChat()
        {
            int requestCount = 0;
            byte[] bytesFrom = new byte[100025];
            string dataFromClient = null;
            Byte[] sendBytes = null;
            string serverResponse = null;
            string rCount = null;
            requestCount = 0;

            while ((true))
            {
                try
                {
                    requestCount = requestCount + 1;
                    NetworkStream networkStream = clientSocket.GetStream();
                    networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                    Console.WriteLine("From client - " + clNo + " : " + dataFromClient);
                    rCount = Convert.ToString(requestCount);

                    Program.broadcast(dataFromClient, clNo, true);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }//end while
        }//end doChat
    } //end class handleClinet
}

客户:

using System;
using System.Windows.Forms;
using System.Text;
using System.Net.Sockets;
using System.Threading;
namespace ChatClientForms
{
    public partial class Form1 : Form
    {
        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        NetworkStream serverStream = default(NetworkStream);
        string readData = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox3.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            readData = "Conected to Chat Server ...";
            msg();
            clientSocket.Connect("127.0.0.1", 8888);
            serverStream = clientSocket.GetStream();

            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox1.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();

            Thread ctThread = new Thread(getMessage);
            ctThread.Start();
        }

        private void getMessage()
        {
            while (true)
            {
                serverStream = clientSocket.GetStream();
                int buffSize = 0;
                byte[] inStream = new byte[100025];
                buffSize = clientSocket.ReceiveBufferSize;
                serverStream.Read(inStream, 0, buffSize);
                string returndata = System.Text.Encoding.ASCII.GetString(inStream);
                readData = "" + returndata;
                msg();
            }
        }

        private void msg()
        {
            if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(msg));
            else
                textBox2.Text = textBox2.Text + Environment.NewLine + " >> " + readData;
        }

    }
}

【讨论】:

  • 这不是问题的答案。无论如何,它都无法解释为什么 OP 的代码不起作用。另请注意,您声称 OP 应该使用套接字是愚蠢的。他们正在使用TcpClient,它只是套接字的一个包装器,它是一种非常好的网络操作方式。最后,只是代码转储的帖子,没有任何有用的解释,是没有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2012-12-03
  • 2021-03-10
相关资源
最近更新 更多