Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[C#]使用TcpListener及TcpClient开发一个简单的Chat工具

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

作者头像
CNXY
发布于 2017-12-25 04:14:58
发布于 2017-12-25 04:14:58
1.5K00
代码可运行
举报
文章被收录于专栏:C# 编程C# 编程
运行总次数:0
代码可运行

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
            }
        }
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
            }
         }   
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# TCP通讯示例
示例目的:使用控制台项目模板分别新建一个服务器和一个客户端,实现两两通讯 1. 新建服务器项目 using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace server { class Program { static TcpClient tcpClient; static NetworkStrea
zls365
2021/01/13
2.3K0
C# TCP通讯示例
C# 三种方式实现Socket数据接收(经典)
public abstract int Read(byte[] buffer, int offset, int count)
zls365
2021/01/14
8.1K0
C# 三种方式实现Socket数据接收(经典)
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
应粉丝需求做一个服务端与客户端通讯的示例,需求比较简单,我们使用Socket TCP协议去构建,直接使用固定长度信息法。
CoderZ
2022/08/29
1.8K0
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
Visual C#.Net网络程序开发-Tcp篇(2) 祥细内容:
前面我们说,TcpClient类创建在Socket之上,在Tcp服务方面提供了更高层次的抽象,体现在网络数据的发送和接受方面,是TcpClient使用标准的Stream流处理技术,使得它读写数据更加方便直观,同时,.Net框架负责提供更丰富的结构来处理流,贯穿于整个.Net框架中的流具有更广泛的兼容性,构建在更一般化的流操作上的通用方法使我们不再需要困惑于文件的实际内容(HTML、XML 或其他任何内容),应用程序都将使用一致的方法(Stream.Write、Stream.Read) 发送和接收数据。另外,
脑洞的蜂蜜
2018/02/02
2.1K0
C# 一分钟浅谈:UDP 与 TCP 协议区别
在网络编程领域,传输层协议的选择对于应用程序的性能和可靠性至关重要。TCP(传输控制协议)和 UDP(用户数据报协议)是两种最常用的传输层协议。本文将从基础概念出发,逐步深入探讨这两种协议的区别,并通过 C# 代码示例来说明它们的应用场景和注意事项。
Jimaks
2024/10/30
1280
C# 一分钟浅谈:UDP 与 TCP 协议区别
C#的Sockets
在现代软件开发中,网络通信是不可或缺的一部分。C#提供了一套强大的Sockets API,允许开发者进行底层的网络通信编程。本文将深入探讨Sockets的工作原理、使用场景、最佳实践以及一些高级技巧。
Michel_Rolle
2024/10/09
3.2K0
C#网络编程(同步传输字符串) - Part.2
在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可以在客户端与服务端之间传输任何类型的数据。对客户端来说,往流中写入数据,即为向服务器传送数据;从流中读取数据,即为从服务端接收数据。对服务端来说,往流中写入数据,即为向客户端发送数据;从流中读取数据,即为从客户端接收数据。
张子阳
2018/09/30
9670
学习记录——C#实现简单网络通信
方法1:Socket(套接字)编程(Tcp) TCPServer代码 using System; using System.Net; using System.Net.Sockets; using System.Text; namespace TcpServer { class Program { static void Main(string[] args) { //建立连接 Socket tcpServer = n
MrLi001
2022/02/23
6980
c# UDP/TCP协议简单实现(简单聊天工具)
1、用户登陆于服务器通信用到的tcp协议,服务器接收到用户登陆信息(包括ip,端口,用户名等)后,返回已经登陆的用户列表信息(包括ip,端口,用户名等)给这个用户,同时服务器使用Udp协议向已经登陆的用户发送最新用户列表(包括ip,端口,用户名等)用于更新用户列表
冰封一夏
2019/09/11
1.4K0
你也可以写个聊天程序 C# Socket学习
我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解。我今天就来和大家一起学习下Socket,并写一个简单的聊天程序。
郑子铭
2023/08/30
4280
你也可以写个聊天程序 C# Socket学习
C#网络编程(接收文件) - Part.5
这篇文章将完成 Part.4 中剩余的部分,它们本来是一篇完整的文章,但是因为上一篇比较长,合并起来页数太多,浏览起来可能会比较不方便,我就将它拆为两篇了,本文便是它的后半部分。我们继续进行上一篇没有完成的步骤:客户端接收来自服务端的文件。
张子阳
2018/09/30
8860
C# 一分钟浅谈:Socket 编程基础
在现代网络应用开发中,Socket 编程是一种非常重要的技术,它允许不同设备之间的应用程序通过网络进行通信。本文将从基础概念入手,逐步深入到 Socket 编程中的常见问题和易错点,并通过具体的代码示例来帮助读者更好地理解和掌握这一技术。
Jimaks
2024/10/18
2330
C#网络编程(订立协议和发送文件) - Part.4
前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件。比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1、S2或S3(S为Send缩写)时,分别向服务端发送文件Client01.jpg、Client02.jpg、Client03.jpg;当我们输入R1、R2或R3时(R为Receive缩写),则分别从服务端接收文件Server01.jpg、Server02.jpg、Server03.jpg。那么,我们该如何完成这件事呢?此时可能有这样两种做法:
张子阳
2018/09/30
9150
C#网络编程(订立协议和发送文件) - Part.4
面向对象(二十七)-Socket TCPListener
简介: 对Socket的封装,使其使用较为简单。 Server Code // 建立一个TCP监听对象,来监听客户端端的连接 TcpListener server = new TcpListener(IPAddress.Parse("172.26.128.1"), 8090); // 开始监听客户端的连接 server.Start(); // 接收连接上的客户端
孙寅
2020/06/02
4820
C# 温故而知新:Stream篇(七)
NetworkStream 目录: NetworkStream的作用 简单介绍下TCP/IP 协议和相关层次 简单说明下 TCP和UDP的区别 简单介绍下套接字(Socket)的概念 简单介绍下TcpClient,TcpListener,IPEndPoint类的作用 使用NetworkStream的注意事项和局限性 NetworkStream的构造 NetworkStream的属性 NetworkStream的方法 NetwrokStream的简单示例 创建一个客户端向服务端传输图片的小示例 本章总结 1.
逸鹏
2018/04/10
1.5K0
C# 温故而知新:Stream篇(七)
超详细的TCP、Sokcket和SuperSocket入门指导
然后编写服务代码,SuperSocket的服务代码主要是配置AppServer对象,因为AppServer已经很好的封装端口监听了。
Kiba518
2020/10/23
1.1K0
C#中Socket的简单使用
一.Socket的概念 Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口.
全栈程序员站长
2022/09/07
1.1K0
C#中Socket的简单使用
C# Socket编程笔记
看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句。(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是,为了自己下一篇要写的文章做参考,还是有必要先补充一下socket基础知识。
zls365
2020/08/19
1.2K0
C# Socket编程笔记
C# TCP/IP 文件(图片、视频等)收发系统
1. 窗口最小化到托盘及右键图标显示菜单; 2. D:\Picture\device2 D:\Picture\device1 D:\Record 路径下有数据更新以后将新增加的文件通过TCP/IP上传到云端; 3. 界面上可以显示数据收发的进度条; 注意:1. 收发用同一个客户端 2. LocalPort 收发端需要不一样
zls365
2020/08/19
1.2K0
C# TCP/IP 文件(图片、视频等)收发系统
c#简单的socket通讯demo
代码中注释比较多 如果仍旧看不懂请看JimmyZhang的这篇文章 http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html 讲的很细很基础
liulun
2022/05/09
3680
推荐阅读
相关推荐
C# TCP通讯示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验