• C# Socket之TCP


    1.C# Socket之TCP服务器

    需要引用using System.Net.Sockets; using System.Net;两个命名空间;

    namespace TcpServer  //服务器
    {
        class Program
        {
            public static List<Client> clientList = new List<Client>();
           
            static void Main(string[] args)
            {
                Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket对象
                tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090));//绑定IP和申请端口
    
                tcpServer.Listen(100);//设置客户端最大连接数
                Console.WriteLine("服务器已启动,等待连接.........");
                while (true)//循环等待新客户端的连接
                {
                    Socket clientSocket = tcpServer.Accept();
                    Console.WriteLine((clientSocket.RemoteEndPoint as IPEndPoint).Address+"已连接");
                    Client client = new Client(clientSocket);
                    clientList.Add(client);
                }
            }
            public static void BroadcastMessage(string message, Client clientSocket)//这个函数用来广播接收到的客户端消息  参数1为消息,参数2为消息来源(客户端)
            {
                var onConnectedList = new List<Client>();//用来存储已断开服务器连接的客户端
    
                foreach (var client in clientList)//遍历已经存储的客户端
                {
                    if (clientSocket == client)//如果该客户端是消息来源,则不重复发送消息给该客户端
                    {
                        continue;
                    }
                    if (client.Connected)//判断该客户端的状态
                    {
                        client.SendMessage(client.ip + ":" + message);//
                    }
                    else//把已断开连接的客户端放到数组中
                    {
                        onConnectedList.Add(client);
                    }
                }
                foreach (var temp in onConnectedList)//广播完之后从存储已连接客户端集合中移除掉已断开连接的客户端
                {
                    clientList.Remove(temp);
                }
            }
        }
    }
    

      

    namespace TcpServer  
    {
        class Client
        {
            private Socket clientSocket;
            private Thread t;
            public string ip = "";
            private byte[] data = new byte[1024];
            public Client(Socket socket)
            {
                clientSocket = socket;
                ip = (clientSocket.RemoteEndPoint as IPEndPoint).Address.ToString();//获取客户端的ip
                t = new Thread(ReceiveMessage);//开启线程执行循环接收消息
                t.Start();
            }
            private void ReceiveMessage()//接收消息
            {
                int length = 0;//初始化消息的长度
                while (true)//循环接收消息
                {
                    length = clientSocket.Receive(data);//获取存放消息数据数组的长度
                    if (clientSocket.Poll(10, SelectMode.SelectRead))//????
                    {
                        clientSocket.Close();
                        break;
                    }
                    if (length != 0)//判断是否有数组内是否存放消息数据
                    {
                        string message = Encoding.UTF8.GetString(data, 0, length);//Byte转为string
                        Program.BroadcastMessage(message, this);//广播给其他客户端
                        Console.WriteLine("来自" + (clientSocket.RemoteEndPoint as IPEndPoint).Address + ":" + message);//输出到服务器控制台
                        length = 0;//归0
                    }
                }
            }
            public void SendMessage(string message)//发送消息
            {
                byte[] data = Encoding.UTF8.GetBytes(message);
                clientSocket.Send(data);
            }
            public bool Connected//获取该客户端的状态
            {
                get { return clientSocket.Connected; }
            }
        }
    }
    

      

    2.C# Socket之TCP客户端

    namespace TcpClient
    {
        class Program
        {
            private static Thread  t;
            private static Socket clientScoket;
            private static byte[] data= new byte[1024];
            static void Main(string[] args)
            {
                ConnectToServer();//创建scoket对象并连接到服务器
               
                while (true)
                {
                    string message2 = Console.ReadLine();
                    SendMessage(message2);
                }
               
                Console.ReadKey();
            }
            static void ConnectToServer()
            {
                clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                 clientScoket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090));
                Console.WriteLine("已连接到服务器");
                t = new Thread(ReceiveMessage);//开启线程执行循环接收消息
                t.Start();
    
            }
            static void SendMessage(string message)//发送消息
            {
                byte[] data = Encoding.UTF8.GetBytes(message);
                clientScoket.Send(data);
            }
            static void ReceiveMessage()//接收消息
            {
                int length = 0;
                while (true)
                {
                    if (clientScoket.Connected==true)
                    {
                        length = clientScoket.Receive(data);
                        if (length != 0)
                        {
                            string message = Encoding.UTF8.GetString(data, 0, length);
                             Console.WriteLine(message);
                        }
                    }
                }         
            }
        }
    }
    

    C# Socket的TCP通讯

     

    Socket的TCP通讯

    一、 socket的通讯原理

    服务器端的步骤如下。

    (1)建立服务器端的Socket,开始侦听整个网络中的连接请求。

    (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。

    (3)当完成通信后,服务器关闭与客户端的Socket连接。

    客户端的步骤如下。

    (1)建立客户端的Socket,确定要连接的服务器的主机名和端口。

    (2)发送连接请求到服务器,并等待服务器的回馈信息。

    (3)连接成功后,与服务器进行数据的交互。

    (4)数据处理完毕后,关闭自身的Socket连接。

    二、 socket的通讯方式

    socket通讯方式有两种:同步和异步

    同步工作方式:

    用TCP协议进行编程时程序执行到发送、接收和监听语句的时候,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。

    异步工作方式

    程序执行到发送、接收和监听语句的时候,不论工作是否完成,都会继续往下执行。

    作者:Leo_wl
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    版权信息
  • 相关阅读:
    struts2标签具体解释
    证明N={1,2,...,n,...}最高万元 黄晓宁
    Oracle 11g 环境,使用utl_smtp创建一个存储过程来发送邮件
    通过非暴力促进国内操作系统的可行性分析
    pig 的chararry不能用于比较的类型可以comparison operator
    Tair LDB基于Prefixkey找到如何提取一系列性能优化项目key的prefix_size
    hdu 5073 Galaxy(2014acm鞍山亚洲分部 D)
    乐趣与你rabbitMQ 源代码
    我们的空间是它圆——基于Poicare对宇宙的模型
    自己主动旋转木马,自己主动作为幻灯片标题类似或图片
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/14299018.html
Copyright © 2020-2023  润新知