C# Socket 的简易使用方法

C# Socket 的简易使用方法

1.服务端

  • 新建一个Socket对象

    Socket Server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    

    AddressFamily.InterNetwork,代表的是IPV4 类型

    SocketType.Stream 代表的是用的Stream 这种字节流模式

    ProtocolType.TCP 表示通信模式为TCP

  • 设置Socket的IP及端口

    IPAddress ip = IpAddress.Phare("127.0.0.1");//或者IPAddress ip = IPAddress.Any;
    int port = 8888;//端口号
    IPEndPoint iPEndPoint = new IPEndPoint(ip, port);//含有Ip与端口号的网络终结点
    
  • 设置监听

    Server.Bind(ipEndPoint);//将IP、端口与Socket绑定
    Server.Listen(10);//设置此服务端可连接的客户端数量
    
  • 开始监听

    Socket Listen = Server.Accept();//Server.Accept();方法会返回一个新的与客户端连接的Socket,代码运行到这里的时候会卡住等待客户端连接,若不想卡住可新开一个线程。
    
  • 收集监听的信息

    byte[] buffer = new byte[1024*1024*2] //设置能够接受数据的字节大小
    int r = Listen.Receiver(buffer);//收到客户端发的信息为int类型的数字流
    string str = Encoding.UTF8.GetString(buffer,0,r);//将接受到的int 类型buffer解码为string,步长为从0到r;
    
  • 给客户端发消息

    string str = "Hello,World";
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//将要发送的string 类型文字转换成 byte
    Listen.Send(buffer);//注意此处发送信息的Socket是Listen而不是Server,因为与客户端进行连接的Socket为Listen(Server设置了可监听10个客户端,Listen只是其中一个)
    
  • 包含多线程的完整服务端

     private void button1_Click(object sender, EventArgs e) //假定一个button点击事件触发Socket
            {
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox3.Text));
                server.Bind(point);//将IP、端口与Socket绑定
                server.Listen(10);
                Thread th = new Thread(Listen);//新建一个线程用于后台监听,避免主程序卡死
                th.IsBackground = true;
                th.Start(server);//线程调用的方法的参数要在start里面传入,而不能 
                                 //Thread th = new Thread(Listen(server))
     		}
    		
    		Socket Server_Listen;//发送消息的时候也要用到此Socket,故设置为全局变量;
    
    		void Listen(object o)/*因为线程不能重载除object类型外的其他类型,
                                 故定义此方法传入的参数为object,再通过as的方式改回Socket
                                 此线程用于与客户端通信*/
            {	Socket server = o as Socket;
             	while(true)
                {
                    Server_Listen = Server.Accept();//发送消息的时候也要用到此Socket,故设置为全局变量;
                   	Thread th2 = new Thread(receive);
                    th2.IsBackground = true;
                    th2.Start(Server_Listen);
                }
            }
    
    
    
    		void receive(object s) //此线程用来与持续接受客户端的消息
            {
                Socket Server_Listen = s as Socket;
                while(true)
                {
                    byte[] buffer = new byte[1024*1024*2];
                    int r = Server_Listen.Receive(buffer);
                    string str = Encoding.UTF8.GetString(buffer,0,r);
                }
            }
    
    		void Send()//此方法用于个给客户端发消息
            {
                string str = "Hello,world";
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
                Server_Listen.Send(buffer);
            }
    

2.客户端

  • 原理与服务端相同
 Socket Client;
		private void button1_Click(object sender, EventArgs e) //假定一个button点击事件触发Socket
        {
            Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox3.Text));
            client.Connect(iPEndPoint);
            Thread th = new Thread(receive);//新建一个线程用于后台通信,避免主程序卡死
            th.IsBackground = true;
            th.Start();
 		}		
		


		void receive() 
        {
            while(true)
            {
                byte[] buffer = new byte[1024*1024*2];
                int r = Client.Receive(buffer);
                string str = Encoding.UTF8.GetString(buffer,0,r);
            }
        }

		void Send()//此方法用于个给客户端发消息
        {
            string str = "Hello,world";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            Client.Send(buffer);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值