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

namespace UdpClientDemo_Client
{
    internal class User
    {
        TcpClient locaClient;
        Action<String> ShowMsg;
        BinaryWriter bw;
        BinaryReader br;
        String username;

        // 使用指定的IP地址、端口号和用户名创建一个User类的实例
        public User(Action<string> ShowMsg, string remoteIP, int remotePort, String username)
        {
            this.ShowMsg = ShowMsg;
            this.username = username;
            locaClient = new TcpClient();
            locaClient.Connect(remoteIP, remotePort);
            NetworkStream ns = locaClient.GetStream();
            bw = new BinaryWriter(ns);
            br = new BinaryReader(ns);
            StartJS(this.username);
        }

        // 使用现有的TcpClient对象创建一个User类的实例
        public User(Action<String> ShowMsg, TcpClient remote_client)
        {
            this.ShowMsg = ShowMsg;
            locaClient = remote_client;//!!!!!!!!!!
            NetworkStream ns = locaClient.GetStream();
            bw = new BinaryWriter(ns);
            br = new BinaryReader(ns);
        }

        // 启动一个异步任务来接收服务器发送的消息
        private void StartJS(String name)
        {
            String remoteEp = locaClient.Client.RemoteEndPoint.ToString() + '>' + name;

            Task.Run(() =>
            {
                while (true)
                {
                    try
                    {
                        String sss = br.ReadString();
                        ShowMsg(remoteEp + '>' + sss);

                    }
                    catch
                    {
                        ShowMsg('服务端掉线了!');
                        break;
                    }

                }
            });

        }

        // 向服务器发送消息
        public void Send(String str)
        {
            bw.Write(str);
        }

        // 向服务器发送消息,并在消息中包含用户名
        public void Send(String str, String name)
        {
            bw.Write(str + name);
        }
        
    }
}

代码解释:

这段代码定义了一个名为 User 的类,用于表示一个客户端用户。它使用 TCP Socket 与服务器进行通信。

  • locaClient: 一个 TcpClient 对象,表示与服务器的连接。
  • ShowMsg: 一个 Action<String> 委托,用于将消息显示到界面上。
  • bw: 一个 BinaryWriter 对象,用于向服务器发送数据。
  • br: 一个 BinaryReader 对象,用于从服务器接收数据。
  • username: 一个字符串,存储客户端用户名。

构造函数:

  • User(Action<string> ShowMsg, string remoteIP, int remotePort, String username): 使用指定的IP地址、端口号和用户名创建一个 User 对象。
  • User(Action<String> ShowMsg, TcpClient remote_client): 使用现有的 TcpClient 对象创建一个 User 对象。

方法:

  • StartJS(String name): 启动一个异步任务来接收服务器发送的消息。
  • Send(String str): 向服务器发送消息。
  • Send(String str, String name): 向服务器发送消息,并在消息中包含用户名。

工作流程:

  1. 创建一个 User 对象,并指定服务器的IP地址、端口号和用户名。
  2. 调用 StartJS() 方法启动一个异步任务来接收服务器发送的消息。
  3. 使用 Send() 方法向服务器发送消息。
  4. 当接收到服务器发送的消息时,StartJS() 方法会调用 ShowMsg() 委托将消息显示到界面上。

注意:

  • 这段代码只是一个简单的示例,实际应用中可能需要根据具体需求进行修改。
  • 为了确保代码的健壮性,应该添加错误处理机制。
C# TCP Socket编程:构建简单客户端

原文地址: https://www.cveoy.top/t/topic/dnq4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录