客户端程序的代码编写:
    布置界面。往界面上添加一个ListBox控件(用于显示用户列表),一个RichTextBox控件(用于显示聊天消息以及系统消息),一个 TextBox控件(用于发送消息),一个CheckBox控件(确定是否为悄悄话),一个StatusBar控件(name=StatusBar1)以 及四个Button控件(分别为“连接”、“断开连接”、“开始记录”、“发送”)。
    当客户端试图和服务器端进行连接时,一个连接必须建立而且得向服务器端进行注册。 ConnectionServer()函数运用一个TcpClient来和服务器端取得连接,同时创建一个NetworkStream来发送消息。还有, 端口号和服务器端的是保持一致的。
先声明如下变量:
private System.Net.Sockets.TcpClient clientSocket;
private System.Net.Sockets.NetworkStream ns;
private System.IO.StreamReader sr;
ConnectionServer()函数如下:
private void ConnectionServer()
{
    StatusBar1.Text = "正在连接到服务器……";
    try
    {
        clientSocket = new System.Net.Sockets.TcpClient(serverAddress,serverPort);
        ns = clientSocket.GetStream();
        sr = new System.IO.StreamReader(ns);
        connected = true;
    }
    catch (Exception)
    {
        MessageBox.Show("不能连接到服务器!","错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        StatusBar1.Text = "已断开连接";
    }
}
    在和服务器端连接成功后,程序就用RegisterWithServer()函数向服务器端发送一个CONN命令。该命令先是发送该用户的名称,然后从服务器端获得其他所有用户的列表,所有用户列表是在ListBox控件中显示的。
RegisterWithServer()函数如下:
private void RegisterWithServer()
{
    try
    {
        string command = "CONN|" + ChatOut.Text;
        Byte[] outBytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
        ns.Write(outBytes,0,outBytes.Length);
        string serverResponse = sr.ReadLine();
        serverResponse.Trim();
        string[] tokens = serverResponse.Split(new Char[]{'|'});
        if(tokens[0] == "LIST")
        {
            StatusBar1.Text = "已连接";
            btnCloseConnection.Enabled = true;
        }
        for(int n=1; n<tokens.Length;n++)
            lbChatters.Items.Add(tokens[n].Trim(new char[]{'\r','\n'}));
        this.Text = clientName + ":已连接到服务器";
    }
    catch (Exception)
    {
        MessageBox.Show("注册时发生错误!","错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
}
    在此之后,当然就是用户之间的聊天了,由ReceiveChat()函数来完成。该函数是一个独立的线程,它处理所有用户获得的消息和用户发送的消息。它主要处理了CHAT、PRIV、JOIN、GONE、QUIT等命令,处理的方法和服务器端的类似。
ReceiveChat()函数实现如下:
private void ReceiveChat()
{
    bool keepAlive = true;
    while (keepAlive)
    {
        try
        {
            Byte[] buffer = new Byte[2048];
            ns.Read(buffer,0,buffer.Length);
            string chatter = System.Text.Encoding.ASCII.GetString(buffer);
            string[] tokens = chatter.Split(new Char[]{'|'});
            if (tokens[0] == "CHAT")
            {
                rtbChatIn.AppendText(tokens[1]);
                if(logging)
                    logwriter.WriteLine(tokens[1]);
            }
            if (tokens[0] == "PRIV")
            {
                rtbChatIn.AppendText("Private from ");
                rtbChatIn.AppendText(tokens[1].Trim() );
                rtbChatIn.AppendText(tokens[2] + "\r\n");
                if(logging)
                {
                    logwriter.Write("Private from ");
                    logwriter.Write(tokens[1].Trim() );
                    logwriter.WriteLine(tokens[2] + "\r\n");
                }
            }
            if (tokens[0] == "JOIN")
            {
                rtbChatIn.AppendText(tokens[1].Trim() );
                rtbChatIn.AppendText(" has joined the Chat\r\n");
                if(logging)
                {
                    logwriter.WriteLine(tokens[1]+" has joined the Chat");
                }
                string newguy = tokens[1].Trim(new char[]{'\r','\n'});
                lbChatters.Items.Add(newguy);
            }
            if (tokens[0] == "GONE")
            {
                rtbChatIn.AppendText(tokens[1].Trim() );
                rtbChatIn.AppendText(" has left the Chat\r\n");
                if(logging)
                {
                    logwriter.WriteLine(tokens[1]+" has left the Chat");
                }
                lbChatters.Items.Remove(tokens[1].Trim(new char[]{'\r','\n'}));
            }
            if (tokens[0] == "QUIT")
            {
                ns.Close();
                clientSocket.Close();
                keepAlive = false;
                StatusBar1.Text = "服务器端已停止";
                connected= false;
                btnSend.Enabled = false;
                btnCloseConnection.Enabled = false;
            }
        }
        catch(Exception){}
    }
}
    通过以上的一些函数,客户端程序之间就可以进行自由地聊天了,各个用户之间还可以互相发送悄悄话。所以程序已经实现了聊天室的基本功能了,不过最后各个用户还要正常地退出,那就要用到QuitChat()函数了。
QuitChat()函数的具体实现如下:
private void QuitChat()
{
    if(connected)
    {
        try
        {
            string command = "GONE|" + clientName;
            Byte[] outBytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length);
            clientSocket.Close();
        }
        catch(Exception)
        {
        }
    }
    if(logging)
        logwriter.Close();
    if(receive != null && receive.IsAlive)
        receive.Abort();
    this.Text = "客户端";
}
到此为止,客户端程序的主要部分都已经介绍完毕。

C#中的套接字编程(二) --转相关推荐

  1. 浅析C#中的套接字编程

    套接字基本概念: 套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面.套接字存在于通信域中 ...

  2. 什么是Python中的套接字编程?

    摘要:本文涵盖了有关使用Python进行套接字编程的所有领域.套接字可以帮助您建立这些连接,而Python无疑可以简化连接. 本文分享自华为云社区<从零开始学python | 什么是Python ...

  3. C#中的套接字编程(一) --转

    TCP/IP 体系结构与特点     TCP/IP协议实际上就是在物理网上的一组完整的网络协议.其中TCP是提供传输层服务,而IP则是提供网络层服务.TCP/IP包括以下协议:     IP:网间协议 ...

  4. Python中的套接字编程

    文章目录 **连接到服务器:** **一个简单的服务器客户端程序:** **服务器** **客户端** 套接字编程是一种连接网络上的两个节点以相互通信的方法.一个套接字(节点)侦听 IP 处的特定端口 ...

  5. java套接字编程_Java套接字编程:教程

    java套接字编程 本教程是Java套接字编程的简介,从一个简单的客户机-服务器示例开始,该示例演示了Java I / O的基本功能. 将向您介绍原始的java.io软件包和NIO,即Java 1.4 ...

  6. linux udp套接字编程获取报文源地址和源端口(二)

    之前项目中涉及udp套接字编程,其中一个要求是获取客户端发过来报文的端口和ip地址,功能很简单,只是对这一块不很熟.之前使用的方法是通过调用recvmsg这个接口,并通过参数msg里面的msg_nam ...

  7. 计算机网络(二) | 网络编程基础、Socket套接字、UDP和TCP套接字编程

    目录 一.网络编程基础 1.1 为什么需要网络编程 1.2 什么是网络编程 1.3 网络编程中的基本概念 二.Socket套接字 2.1 概念 2.2 分类 2.3 Java数据报套接字通信模型 2. ...

  8. 计算机网络实验二:UDP套接字编程实现多人聊天

    一.实验目的 1. 实现一个能够在局域网中进行点对点聊天的实用程序. 2. 熟悉c++.Java等高级编程语言网络编程的基本操作. 3. 基本了解对话框应用程序的编写过程. 4. 实现UDP套接字编程 ...

  9. python中typeerror怎么解决_Python 3中套接字编程中遇到TypeError: 'str' does not support the buffer interface的解决办法...

    目前正在学习python,使用的工具为python3.2.3.发现3x版本和2x版本有些差异,在套接字编程时,困扰了我很久,先将python核心编程书中的例子 代码如下: 服务器端: #Echo se ...

最新文章

  1. 《中国人工智能学会通讯》——1.42 理解情感
  2. java明星养成游戏_#IT明星不是梦#Java14不得不知的5个新功能
  3. Vector 把一个vector追加到另一个vector
  4. 域用户频繁被锁定怎么解决_视频素材太多怎么办?看Mac用户如何使用NAS解决存储难题...
  5. C++(22)--继承和派生
  6. 学习ecshop 教程网址
  7. 加强型的记录集权限(数据集权限、约束表达式设置功能)实现方法界面参考...
  8. windows系统 安装MongoDB
  9. 在 NetBeans IDE 中调试 PHP 源代码
  10. 服务器提交协议冲突 Section=ResponseStatusLine 的解决办法
  11. 用FileZilla搭建的Ftp其他电脑无法访问的问题
  12. 自己对Java的一些认识
  13. 高聚合和低耦合的理解
  14. (5)全局异常捕捉【从零开始学Spring Boot】
  15. python 分数等级转换_一文读懂,新高考“3+1+2”模式中等级赋分如何换算?
  16. 数据挖掘之大数据流处理
  17. 基于stm32单片机PT100铂电阻温度采集系统
  18. python爬取链家深圳全部二手房的详细信息
  19. 当年意气不肯平,白发如丝叹何益。贪心跳跃游戏
  20. Java第二次实训课堂

热门文章

  1. Windows 10半年成全球第二!中国悲剧了
  2. 解决office2007每次打开提示向程序发送命令时出现错误
  3. linux运维初级课前实战随机考试题含答案(笔试+上机)
  4. 网域高科家具行业网站开发管理系统
  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 04 谈谈你对分布式的理解,为什么引入分布式?
  6. Vue-cli3配置教程入门
  7. Forever让NodeJS应用后台执行
  8. ZooKeeper--分层仲裁简介
  9. 行为设计模式 - 观察者设计模式
  10. [leetcode]1.两数之和