[C#]使用TcpListener及TcpClient开发一个简单的Chat工具

本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!

本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参考,

本例子比较简单,使用的是控制台程序开发,若需要使用该软件作为演示,必须先运行服务端,再运行客户端。

因为是首次接触该方面的知识,写得比较简陋,如有更好的建议,请提出,谢谢!

一、编写服务器端代码,如下:

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

namespace ChatServer
{
    class Program
    {
        static void Main(string[] args)
        {
            bool cancel = false;
            byte[] buffer = new byte[1024];
            string message;
            byte[] messageBytes;
            int count = 0;
            TcpListener tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, 13000));
            tcpListener.Start();
            Console.WriteLine("Waiting for a connection... ");
            TcpClient tcpClient = tcpListener.AcceptTcpClient();
            Console.WriteLine("Connected.");
            NetworkStream stream = tcpClient.GetStream();
           
           Task.Factory.StartNew(() => 
            {
                while ((count = stream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss fff} Reply from server {tcpClient.Client.LocalEndPoint.ToString()}:{Encoding.UTF8.GetString(buffer, 0, count)}");
                }
            });
                   
            Task t = Task.Factory.StartNew(() => 
            {
                while(!cancel)
                {
                    message = Console.ReadLine();
                    if (message.ToUpper() == "Y")
                    {
                        cancel = true;
                        return;
                    }
                    messageBytes = Encoding.UTF8.GetBytes(message);
                    stream.Write(messageBytes, 0, messageBytes.Length);
                }
            });
                      
            if (cancel) tcpClient.Close();
                
            while (true)
            {
                if (t != null && t.IsCompleted) break;
            }
        }
    }
}

二、编写客户端代码,如下:

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

namespace ChatClient
{
    class Program
    {
        static void Main(string[] args)
        {
            bool cancel = false;
            byte[] buffer = new byte[1024];
            string message;
            byte[] messageBytes;
            int count = 0;
            try
            {
                TcpClient tcpClient = new TcpClient(new IPEndPoint(Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(p => p.AddressFamily == AddressFamily.InterNetwork).First(), 14000));
                tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.94.26"), 13000));
                NetworkStream stream = tcpClient.GetStream();
                
                Task.Factory.StartNew(() =>
                {
                    while ((count = stream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss fff} Reply from client {tcpClient.Client.LocalEndPoint.ToString()}:{Encoding.UTF8.GetString(buffer, 0, count)}");
                    }
                });
                Task t = Task.Factory.StartNew(() =>
                {
                    while (!cancel)
                    {
                        message = Console.ReadLine();
                        if (message.ToUpper() == "Y")
                        {
                            cancel = true;
                            return;
                        }
                        messageBytes = Encoding.UTF8.GetBytes(message);
                        stream.Write(messageBytes, 0, messageBytes.Length);
                        Thread.Sleep(10);
                    }
                });
                if (cancel) tcpClient.Close();
               
                while (true)
                {
                    if (t != null && t.IsCompleted) break;
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
         }   
    }
}

三、先运行服务端代码,后再另外一台电脑运行客户端代码,效果图如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

R语言可视化——ggplot图表中的线条

今天跟大家分享的是ggplot图表中的一类重要元素——线条。 不要觉得专门为线条写一章推送有点小题大做,其实线条对于图表而言,功不可没,即便是不起眼的网格、轴线...

2666

应用潜在语义分析技术将文档进行3D可视化

这里使用了 WPF(译者注:Windows Presentation Foundation) 的 3D 展示功能来对一个文档集合进行了可视化,这些文...

2169
来自专栏绿巨人专栏

机器学习实战 - 读书笔记(04) - 朴素贝叶斯

2857
来自专栏贾志刚-OpenCV学堂

手撕OpenCV源码之高斯模糊

从上述代码的大致分析中可以知道,OpenCV的GaussianBlur本质上依然是filter2D,只是针对一些特殊情况进行了GPU和CPU版本的优化,如果输入...

2212
来自专栏Y大宽

RNA-seq(8): 探索分析结果:Data visulization

这部分主要做一些数据可视化,富集分析暂时放下一部分,如果想跳过这里,请直接移步RNA-seq(9):富集分析

2342
来自专栏图形学与OpenGL

实验六 背向面消隐算法

// TODO: add draw code for native data here

1095
来自专栏Deep learning进阶路

caffe随记(二) --- 数据结构简介

caffe随记(二) --- 数据结构简介 注:这篇文章博文我写的内容有点多,建议看一下左上角的目录,对本文结构有个大致了解。 1、Blob Blob其实...

2520
来自专栏MixLab科技+设计实验室

设计师编程指南之Sketch插件开发 6

往期文章索引: 1 / 入门基本概念、page的相关操作 2 / artboard 、NSFileManager 和 NSString 关于文件及文件夹的相关操...

2975
来自专栏Python小屋

Python绘制三次贝塞尔曲线

对于贝塞尔曲线而言,其特点在于第一个控制点恰好是曲线的起点,最后一个控制点是曲线的终点,其他控制点并不在曲线上,而是起到控制曲线形状的作用。另外,曲线的起点处与...

4126
来自专栏和蔼的张星的图像处理专栏

11.YOLOV3训练检测拾遗。

训练配置以及检测我在上一篇文章里已经写过了,这里主要写一下可能会遇到的一些问题及解决方案。 这里面要做的许多事情别人都已经是做过了的,我做一下总结而已。

2463

扫码关注云+社区