C#通信之利用Tcp创建聊天系统——服务端与客户端

一、创建服务端

二、创建客户端

三、连接测试

一  、TCp创建服务端

打开VS,新建工程 TalkText

新建一个类TalkSever.cs

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
//首先创建Tcplistener,然后创建客户端,这个客户端是等到Tcplistener已经连接上客户端之后返回的客户端,这样的话连接上就可以通信了
//然后就是通信的过程,首先服务端输出一句话让客户端输入昵称,然后接收到了客户端发来的信息,在While循环中不停的交换信息,发送接收消息每次结束之后就要清空一下字节数组
namespace TalkingText
{
    public class TalkSever
    {
        private TcpListener server;//作为服务器端
        private TcpClient client;//客户端
        private string name;
        private string sendName;
        private IPAddress addre = IPAddress.Parse("127.0.0.1");//以本机作为服务器端与客户端
        private int port = 5566;

        private NetworkStream stream;

       byte[] receiceByte=new byte[256];
        private string welcome = "你好,我是{0},我们可以通话了";
        public void Start()
        {
            
            Console.WriteLine("请输入您的昵称:");//聊天系统一开始有一个打招呼的过程
            name= Console.ReadLine();//接收返回的字符串
            sendName = name + ":";
            #region MyRegion  连接客户端
            server=new TcpListener(addre,port);//创建Listener
            server.Start();//启动服务器
            client = server.AcceptTcpClient();//等待服务器连接,服务器连接上客户端会返回客户端的一个Client,
            //用client接收,因为一会儿发送信息的时候要用到它
            #endregion

            #region MyRegion  要想相互通信需要获取通信流
            stream = client.GetStream();
            Talk();
            #endregion

        }

        //通话方法
        public void Talk()
        {
            welcome = string.Format(welcome, name);
            stream.Write(Getbytes(welcome), 0, Getbytes(welcome).Length); //设置好欢迎语开始写入数据流中

            //打好招呼之后就开始对话了,对话是随时实时互动,就让字节流随时保持开放状态,While循环一直读取和发送
            while (true)
            {
                int length; //定义收到客户端的信息的长度,因为要判断数据流当中是否有这些数据,根据长度判断
                while ((length = stream.Read(receiceByte, 0, receiceByte.Length)) > 0
                ) //stream.Read()读取的数据会存在于字节数组receiceByte当中
                {
                    #region MyRegion  接收消息

                    string receiveStr = GetString(receiceByte);
                    //因为是以字节流的形式传送,可能字符串中会有\0字符串,所以替换掉
                    receiveStr = receiveStr.Replace("\0", "");
                    Console.WriteLine(receiveStr); //打印获取到的信息

                    #endregion

                    #region MyRegion   发送消息

                    //下面给客户端发送信息
                    string strSend = "";
                    while (strSend == "")
                    {
                        Console.Write("input>"); //提醒在这个后面进行输入
                        strSend = Console.ReadLine(); //当发送消息为空就等待输入
                    }

                    if (strSend == "exit") //退出循环,关闭Client
                    {
                        client.Close();
                        break;
                    }
                    else //发送消息
                    {
                        stream.Write(Getbytes(sendName + strSend), 0, Getbytes(sendName + strSend).Length);
                    }

                    #endregion

                    //因为每发送一次或接收一次,缓冲池中就会有新的数据,为防止数据一直增加溢出字节组,所以每接收一次读取完成之后要清除字节数组当中的数据,然后等待下一次接收,否则所有数据就会连接起来
                    Array.Clear(receiceByte, 0, receiceByte.Length);

                }

                break; //一次循环结束,Break
            }
         //关闭服务器
            server.Stop();

        }

        //字节流转换为字符串
    public string GetString(byte[] bytes)
    {
        return Encoding.UTF8.GetString(bytes);
    }
    //字符串转换为字节流

    public byte[] Getbytes(string contentstring)
    {
        return Encoding.UTF8.GetBytes(contentstring);
    }
    }
}

Main函数中调用,运行项目就会启动方法

二、创建客户端,让客户端去连接服务器。同理打开VS新建工程 TalkClient

新建一个类:Client.cs

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace TalkClient
{
    public class Client
    {
        //客户端类似于服务端
        private TcpClient client;//客户端
        private string name;//昵称
        private string SendMsg;//发送的消息
        private int port = 5566;//端口号
        private NetworkStream stream;//数据流
        byte[] receiceByte=new byte[256];//缓冲的字节数组
        
        
        //建立与服务端的连接

      public  void Start()
        {
            Console.WriteLine("请输入您的昵称");//开始时输出一句话
            //等待用户输入
            name = Console.ReadLine();
            SendMsg = name + ":";//进行通话的时候表明是谁说的
            client =new TcpClient("127.0.0.1",port);//创建客户端
            //连接上服务端之后就可以获取数据流了
            stream = client.GetStream();
            int length = 0;
            //定义length判断stream中是否有数据流,不等于0说明有数据
            while ((length=stream.Read(receiceByte,0,receiceByte.Length))!=0)//获取到的数据存在在缓冲区的字节数组receiceByte中
            {

                #region MyRegion  接收消息

                string receiveStr = GetString(receiceByte);//接收的字节流转换为字符串
                //因为是以字节流的形式传送,可能字符串中会有\0字符串,所以替换掉
                receiveStr = receiveStr.Replace("\0", "");
                Console.WriteLine(receiveStr); //打印获取到的信息

                #endregion

                #region MyRegion   发送消息

                //下面给服务端发送信息
                string strSend = "";
                while (strSend == "")
                {
                    Console.Write("input>"); //提醒在这个后面进行输入
                    strSend = Console.ReadLine(); //当发送消息为空就等待输入
                }

                if (strSend == "exit") //退出循环,关闭Client
                {
                    client.Close();
                    break;
                }
                else //发送消息
                {
                    stream.Write(Getbytes(SendMsg + strSend), 0, Getbytes(SendMsg + strSend).Length);
                }

                #endregion

                //因为每发送一次或接收一次,缓冲池中就会有新的数据,为防止数据一直增加溢出字节组,所以每接收一次读取完成之后要清除字节数组当中的数据,然后等待下一次接收,否则所有数据就会连接起来
                Array.Clear(receiceByte, 0, receiceByte.Length);

                

            }


        }
        //字节流转换为字符串
        public string GetString(byte[] bytes)
        {
            return Encoding.UTF8.GetString(bytes);
        }
        //字符串转换为字节流

        public byte[] Getbytes(string contentstring)
        {
            return Encoding.UTF8.GetBytes(contentstring);
        }
    }

   
    
}

Main函数中调用,运行项目就会启动方法

三、连接测试

先运行服务端,在运行客户端,结果如下

这样简易版的聊天系统就做好了。

发布了152 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40229737/article/details/105165099