c# TCP实现

1TCP介绍

TCP是TCP/IP体系中非常复杂的一个协议,主要特点有

  • 面向连接的运输层协议(好比打电话)
  • 每一条TCPl连接只能有两个端点,TCP是点对点通信。
  • TCP连接提供可靠交付的服务,通过TCP连接的数据,无差错、不丢失、不重复,并且按序到达。
  • TCP提供全双工通信
  • 面向字节流

TCP把连接作为最基本的抽象,TCP连接的两个端口是套接字:socket,主义socket有多种不同的意思,注意区别。
socket=(IP地址:端口号)

C#中实现使用TCP连接

分为服务器端,和客户端。

服务器端

 static   Thread thread_listen = null;//负责监听客户端消息的线程
        static Thread thread_send = null;//负责向客户端发送消息的线程
     static    Socket socket_listen = null; //负责监听客户端的套接字

这三个是重要变量,分别起到了注释里写的作用
贴代码把,,注释挺详细的。

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.Threading;

namespace TCPServer
{
    class Program
    {
     static   Thread thread_listen = null;//负责监听客户端消息的线程
        static Thread thread_send = null;//负责向客户端发送消息的线程
     static    Socket socket_listen = null; //负责监听客户端的套接字
    
       /// <summary>
       /// 用来对客户端进行监听
       /// </summary>
        private static void ListenConnect()
        {
            while (true) //持续不断监听
            {
                try
                {
                    //使用返回的socket客户端做通信
                    Socket client_socket = socket_listen.Accept();
                    Console.WriteLine("一个客户端连接成功");

                 

                    //创建一个通信线程,从客户端接收消息,,
                    var pts = new ParameterizedThreadStart(ReceiveFromClient);
                    Thread thread = new Thread(pts);                
                    thread.IsBackground = true;//后台线程,在主线程退出时退出
                    //启动线程,并将此客户端端口传递给新线程
                    thread.Start(client_socket);

                    //创建一个通信线程,向客户端发送消息,,
                    var send_thread = new ParameterizedThreadStart(SendToClient);
                    Thread thread2 = new Thread(send_thread);
                    thread2.IsBackground = true;
                    thread2.Start(client_socket);

                   
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    break;
                }

            }
        }
        /// <summary>
        /// 用于向客户端发送消息,
        /// </summary>
        /// <param name="socket_client_para">客户端socket</param>
        private static void SendToClient(object socket_client_para)
        {
            Socket client_socket = socket_client_para as Socket;
            while(true)
            {
                try
                {
                    string msg=Console.ReadLine();
                    
                    //对字符串进行编码,得到一个字符串的字节数组
                    byte[] data = Encoding.UTF8.GetBytes(msg);
                    //发送
                    client_socket.Send(data);

                    Console.WriteLine("向客户端发送了一条数据");
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                    
                    client_socket.Close();   //关闭当前与服务器通信的客户端
                    Console.WriteLine("客户端" + client_socket.RemoteEndPoint + "中断连接");
                }

            }

        }
        /// <summary>
        /// 从客户端接收消息
        /// </summary>
        /// <param name="socket_client_para">客户端socket</param>
        private static void ReceiveFromClient(object socket_client_para)
        {
            Socket client_socket = socket_client_para as Socket;
            //向客户端发第一条消息
            
            while (true)
            {
                //创建一个内存缓冲区,大小为1M(2的20次)
                byte[] rec_msg_buffer = new byte[1024 * 1024];

                try
                {
                    //接受来自客户端的消息。返回值为消息的长度
                    int length = client_socket.Receive(rec_msg_buffer);
                    if (length != 0)
                    {
                        string Msg = Encoding.UTF8.GetString(rec_msg_buffer,0,length);
                        Console.WriteLine("客户端" + client_socket.RemoteEndPoint + "的消息:" + Msg);

                    }
                        


                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                  
                    client_socket.Close();   //关闭当前与服务器通信的客户端
                    Console.WriteLine("客户端" + client_socket.RemoteEndPoint + "中断连接");
                }
            }
        }

     
        static void Main(string[] args)
        {
           

            //启动服务
            socket_listen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip_address = IPAddress.Parse("xxx.xxx.xxx.xxx");//服务器ip地址
            IPEndPoint end_point = new IPEndPoint(ip_address, 8333);  //服务器终端

            socket_listen.Bind(end_point);//将socket与终端绑定在一起
            socket_listen.Listen(20);//将套接字的监听队列长度限制为20

            
            thread_listen = new Thread(ListenConnect);
//            thread_listen.IsBackground = true;
            thread_listen.Start();  //启动监听线程

           
            Console.WriteLine("开始监听");


        }
    }
}

客户端

		static Thread thread_client_receive = null;//负责监听服务端消息的线程
        static Thread thread_client_send = null;//负责给服务端发消息的线程
         static Socket  socket = null;//1个客户端套接字

以上为三个重要的变量

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using LitJson;

namespace TCPClient
{
    class Program
    {
        static Thread thread_client_receive = null;//负责监听服务端消息的线程
        static Thread thread_client_send = null;//负责给服务端发消息的线程
         static Socket  socket = null;//1个客户端套接字
        static void Main(string[] args)
        {
            string address = ""; //服务器ip地址
            int port = 8333;                            //服务器端口号
            //定义一个套接字监听
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            try
            {
                Console.WriteLine( "正在连接服务器" + address +":" +port.ToString());
                socket.Connect(new IPEndPoint(IPAddress.Parse(address), port));
                Console.WriteLine("连接成功");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message+"\n连接失败");
                return;
            }

         
            //开启接收服务器消息线程
            Console.WriteLine("连接到服务器");
            thread_client_receive = new Thread(RevFromServer);
            //            thread_client_receive.IsBackground = true;
            thread_client_receive.Start();
                        //开启发送消息线程
            thread_client_send = new Thread(SendMsg);
            //            thread_client_send.IsBackground = true;
            thread_client_send.Start();
            
        
        }
        private static void RevFromServer()
        {
            while (socket.Connected)//持续监听服务器发来的消息
            {
                byte[] rev_msg_buffer = new byte[1024];
                try
                {
                    int length = socket.Receive(rev_msg_buffer);
                    if (length != 0)
                    {
                        string Msg = Encoding.UTF8.GetString(rev_msg_buffer, 0, length);
                        Console.WriteLine("服务器端" + socket.RemoteEndPoint + "的消息:" + Msg);

                    }
                }
                catch (Exception e)
                {

                    Console.WriteLine(e.Message + "\n远程服务器中断连接");
                    break;
                }

            }
        }
        private static void SendMsg()
        {
            while (true)
            {
                try
                {
                    string msg=Console.ReadLine();
                    if (msg == "q")
                    {
                        Console.WriteLine("关闭连接");
                        DisConnect();
                        
                        break;
                     }
                    
                    byte[] byte_msg = Encoding.UTF8.GetBytes(msg);
                    socket.Send(byte_msg);
                    Console.WriteLine("已发送");
                }
                catch(Exception e)
                {
                    Console.WriteLine("与服务器通信终端");
                    DisConnect();
                    return;
                }
            }
        }
      
        static void DisConnect()
        {
            socket.Disconnect(true);
            thread_client_receive.Abort();
        }
    }
}

完成咯

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值