第二章、C#控制台实现一对一聊天&C#使用socket一对一通信&C#socket类的简单封装&两个控制台聊天

C#网络通信系列学习笔记



前言

在上一章中,我们只实现了最简单的socket通信,只有单次收发过程,在这一篇文章中,将会通过对Socket简单封装实现控制台的多发多收通信


一、socket简单封装

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

namespace ConsoleTest
{
    class SocketTest
    {
        private Socket MySocket;
        //开启一个线程循环执行接收方法来实时接收数据
        private Thread ReceiveThread;

        //用于客户端连接服务端
        public bool Connect(IPAddress iP, int port)
        {
            try
            {
                MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint endPoint = new IPEndPoint(iP, port);
                MySocket.Connect(endPoint);
                return true;
            }
            catch
            {
                return false;
            }
        }

        //用于服务端监听
        public void Listen(IPAddress ip, int port)
        {
            Socket socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint endPoint = new IPEndPoint(ip, port);
            socketwatch.Bind(endPoint);
            socketwatch.Listen(1);//开始监听,参数表示最大允许几台主机连接我
            Console.WriteLine("开始监听 端口号:" + port);
            MySocket = socketwatch.Accept();//如果有客户端连接,就会返回这个客户端的sockeet对象
        }

        public bool Send(string str)
        {
            try
            {
                byte[] arrsendmsg = Encoding.UTF8.GetBytes(str);
                if (MySocket.Send(arrsendmsg) != arrsendmsg.Length)
                    return false;
                return true;
            }
            catch
            {
                return false;
            }
        }

        public void recmsg()
        {
            while (true)
            {

                try
                {
                    byte[] arrserverrecmsg = new byte[1024];
                    int length = MySocket.Receive(arrserverrecmsg);
                    if (length > 0)
                    {
                        Console.WriteLine("对方:" + Encoding.UTF8.GetString(arrserverrecmsg, 0, length));
                    }
                }
                catch
                {
                    Console.WriteLine("对方连接已断开");
                    return;
                }
                Thread.Sleep(200);
            }
        }

        public void StartReceive()
        {
            ReceiveThread = new Thread(recmsg);
            ReceiveThread.Start();
        }

        public void ColseSocket()
        {
            //如果接收线程正在执行那么先关闭线程在关闭socket
            if (ReceiveThread.ThreadState == ThreadState.Running)
                ReceiveThread.Abort();
            MySocket.Close();
        }
    }
}

二、使用步骤

1.客户端

代码如下(示例):

using System;
using System.Net;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SocketTest mySocket = new SocketTest();
            if (!mySocket.Connect(IPAddress.Parse("127.0.0.1"), 20000))
            {
                Console.WriteLine("网络连接失败");
                return;
            }
            mySocket.StartReceive();
            string myMsg;
            while ((myMsg = Console.ReadLine()) != "exit")
            {
                mySocket.Send(myMsg);
            }
            mySocket.ColseSocket();
        }
    }
}

2.服务端

代码如下(示例):

using System;
using System.Net;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SocketTest socketTest = new SocketTest();
            socketTest.Listen(IPAddress.Any, 20000);
            Console.WriteLine("有客户端连接了,开始聊天吧");
            socketTest.StartReceive();
            string myMsg;
            while ((myMsg = Console.ReadLine()) != "exit")
            {
                socketTest.Send(myMsg);
            }
            socketTest.ColseSocket();
        }
    }
}

三、演示

在这里插入图片描述
小提示:输入exit是会直接退出的哦!

总结

以上就是今天分享的内容,这篇文章通过对socket进行了简单的封装实现了客户端和服务端都可以同时使用并且支持多发多收。
只是有一个小缺点,当你正在打字的时候,对方突然给你发一条消息,那么你打字的这一行后面就会追加上对方的消息哦,不过这样并不影响发送,只是显得不太优雅。
在下一篇文章中,将会继续在这一篇代码的基础上修改,实现一个简单的界面聊天室,让多个人参与到聊天当中!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值