C# 网络编程之Tcp实现客户端和服务器聊天

简介:

      最近使用Socket网络套接字编程中,在同步与异步通讯中客户端与服务器总是无法响应,但在学习Tcp协议编程中完成了通讯聊天功能,下面简单讲讲我最近学到的及Tcp聊天的源代码及详细注释。
      Tcp协议是一个传输层的协议,在Tcp协议编程中它通常使用的是3个类,其命名空间为System.Net.Sockets:

      1.TcpListener:基于TCP协议服务端开发,监听IP地址和端口号是否连接。
      该类常用的方法有Start()开始监听、AcceptSocket()返回套接字接受连接请求、AcceptTcpClient()返回客户对象接受连接请求、Stop()停止监听

      2.TcpClient:基于TCP协议客户端编程,提供客户端连接,通过网络连接发送接受数据。
      该类常用的方法有Connect()与服务器主机连接、GetStream()用来获得答应的数据流、Close()关闭连接

      3.NetWorkStream:用于获取和操作网络流,该程序中还是用写入流和读取流对象实现写入和读取数据的操作。
      该类常用的方法有Read()从网络流中读取数据、Write()从网络流中写数据。

      下面是这个例子的源代码:(该代码是根据自己所学及《C#范例开发大全》中一个例子改变而来通过两个控制台程序实现通话)
      1.服务端代码(TCPServer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//添加新的命名空间
using System.Net;
using System.Net.Sockets;     
using System.IO;              //流StreamReader

namespace TCPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            //Parse将字符串转换为IP地址类型
            IPAddress myIP = IPAddress.Parse("127.0.0.1");
            //构造一个TcpListener(IP地址,端口)对象,TCP服务端
            TcpListener myServer = new TcpListener(myIP,6688);
           
            //开始监听
            myServer.Start();
            Console.WriteLine("等候一个连接...");

            //构造TCP客户端:接受连接请求
            TcpClient client = myServer.AcceptTcpClient();
            Console.WriteLine("客户端已经连接...");

            //构造NetworkStream类,该类用于获取和操作网络流
            NetworkStream stream = client.GetStream();
            //读数据流对象
            StreamReader sr = new StreamReader(stream);
            //写数据流对象
            StreamWriter sw = new StreamWriter(stream);

            while (true)
            {
                Console.WriteLine("客户端:" + sr.ReadLine());
                string msg = Console.ReadLine();
                sw.WriteLine(msg);
                sw.Flush();               //刷新流
            }
            client.Close();               //关闭客户端
        }
    }
}

      2.客户端代码(TCPClient)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//添加新的命名空间
using System.Net;
using System.Net.Sockets;
using System.IO;              //流StreamReader

namespace TCPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //Parse将字符串转换为IP地址类型
            IPAddress myIP = IPAddress.Parse("127.0.0.1");
            //构造一个TcpClient类对象,TCP客户端
            TcpClient client = new TcpClient();
            //与TCP服务器连接
            client.Connect(myIP, 6688);
            Console.WriteLine("服务器已经连接...请输入对话内容...");

            //创建网络流,获取数据流
            NetworkStream stream = client.GetStream();
            //读数据流对象
            StreamReader sr = new StreamReader(stream);
            //写数据流对象
            StreamWriter sw = new StreamWriter(stream);

            while (true)
            {
                string msg = Console.ReadLine();
                sw.WriteLine(msg);
                sw.Flush();             //刷新流
                Console.WriteLine("服务器:" + sr.ReadLine());
            }
            client.Close();
            Console.Read();
        }
    }
}

      3.程序演示
      先运行服务器(TCPServer)代码,它会显示“等候一个连接...”.再运行客户端(TCPClient)代码,运行后此时服务端显示"客户端已连接...",客户端显示"服务器已连接...请输入对话内容".然后依次在客户端和服务器中个输入聊天内容,在另一方会显示相应传输过来的内容,实现TCP聊天通话。下面是在客户端输入"你好!我是客户端."的反应。

      更多的通话内容如下所示:

      总结:这是自己认为写得比较好的一篇文章,它比较实用,更重要的是我编写上面的代码能运行。我们只需要稍微的界面设计就能实现一个有界面的网络聊天室.它涉及到的知识主要是C#网络编程中的TCP编程知识,最近写Socket套接字方面的通讯总是失败,也看了很多博客下载了很多程序,但都没一个比较满意的。希望上面的文章能帮组到大家,有错误不足之处见谅!

      最后感谢刘丽霞的《C#范例开发大全》和周存杰的《C#网络编程实例教程》两本书,上面的知识点和代码都是借鉴了他们前人的知识,希望大家也看看这两本比较好的C#书。

     (By:Eastmount 2013-7-20 http://blog.csdn.net/eastmount/

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
67 2
|
7天前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
34 5
|
26天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
49 13
|
2月前
|
存储 安全 数据可视化
提升网络安全防御有效性,服务器DDoS防御软件解读
提升网络安全防御有效性,服务器DDoS防御软件解读
51 1
提升网络安全防御有效性,服务器DDoS防御软件解读
|
29天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
246 2
|
16天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
2月前
|
安全 区块链 数据库
|
25天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
31 3
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
46 2