C#基于Socket的TCP通讯例程 Server Client

一、简单了解服务端和客户端各自的功能

首先应该清楚服务端(Server)和客户端(Client)它们各自的功能。
(1)服务端(Server):负责接收客户端的请求,然后根据客户端请求的内容不同而给客户端返回相应的数据。
(2)客户端(Client):接服务端,向服务端发送自己的业务需求(也就是数据),然后接受服务端返回过来的信息。
(3)分析服务端和客户端的功能,可以很清楚的知道,它们完成了数据之间的交流,或者说是业务之间的相互传递与获取。

二、服务器与客户端之间信息传递的桥梁(Socket)

(1)服务器和客户端进行信息传递的通道,socket套接字分为很多种类型,它是一个协议族,常用的协议TCP/IP和UDP两种。
(2)简单来说就是通过socket协议能够进行通信,每种编程语言socket的写法都八九不离十,创建socket通信的步骤都十分接近。
(3)服务端socket和客户端socket通过对方的IP地址和对应应用程序的PORT(端口号)进行连接和数据传输。

三、代码功能

功能如下:
1、基础功能包括服务器开启监听服务,监听客户端,可以断开监听,客户端可以连接服务器,断开服务器,当客户端和服务器连接成功后,两者可以相互通讯;
2、扩展功能包括一个服务器可以连接多个客户端,每个客户端连接成功后,都会记录并显示对应的IP及端口,断开后删除对应的IP及端口,在发送消息时会加上对应的IP及端口,服务器在发送消息时,可以在列表那选择某个客户端进行发送消息,也可以对所有客户端进行群发消息。

四、代码实现效果图

服务器端运行效果
客户端1运行效果
客户端2运行效果

五、代码实现

服务器的.cs文件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TcpMsgServer
{
   
    public partial class FrmServer : Form
    {
   
        public FrmServer()
        {
   
            InitializeComponent();
            //关闭对文本框的非法线程操作检查
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }

        Thread threadWatch = null; //负责监听客户端的线程
        Socket socketWatch = null; //负责监听客户端的套接字     

        Dictionary<string, Socket> dict = new Dictionary<string, Socket>(); //套接字集合
        Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();  //线程集合

        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnServerConn_Click(object sender, EventArgs e)
        {
   
            try
            {
   
                //定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)
                socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //服务端发送信息 需要1个IP地址和端口号              
                IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text.Trim());  //获取文本框输入的IP地址
                //将IP地址和端口号绑定到网络节点endpoint上 
                IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim())); //获取文本框上输入的端口号
                //监听绑定的网络节点
                socketWatch.Bind(endpoint);
                //将套接字的监听队列长度限制为20
                socketWatch.Listen(20);
                //创建一个监听委托
                ThreadStart ts = new ThreadStart(WatchConnecting);
                //创建一个监听线程 
                threadWatch = new Thread(ts);
                //将窗体线程设置为与后台同步
                threadWatch.IsBackground = true;
                //启动线程
                threadWatch.Start();
                //启动线程后 txtMsg文本框显示相应提示
                txtMsg.AppendText("开始监听客户端传来的信息!" + "\r\n");

                this.btnServerConn.Enabled = false;
                this.btnServerDisConn.Enabled = true;
            }
            catch (Exception ex) {
   
                Console.WriteLine("错误:"+ex.ToString());
                txtMsg.AppendText("服务端启动服务失败!" + "\r\n");
                this.btnServerConn.Enabled = true;
            }
        }

        private void btnServerDisConn_Click(object sender, EventArgs e)
        {
   
            //有问题
            socketWatch.Close();
            threadWatch.Abort();
            
            txtMsg.AppendText("结束监听客户端传来的信息!" + "\r\n");
            this.btnServerConn.Enabled = true;
            this.btnServerDisConn.Enabled = false;

        
  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值