zoukankan      html  css  js  c++  java
  • socket网络编程

    socket进程间的通信机制,也叫套接字。

    tcp:3次握手,服务器安全稳定,但是效率低。

    udp:快速效率高,但是不稳定,容易发生数据丢失,没有经历3次握手。

    服务器端:socket(),bind()绑定监听端口,listen()设置监听队列, accept():在while(true)循环等待客户端连接,receive(),send(),close()。

    客户端:socket(),connect()连接建立,send()发送数据,receive()接收数据,close()。

    //socket网络编程
    //服务器端
    private void btnStart_Click(object sender, EventArgs e)
    {
      try{
    //当点击开始监听的时候,在服务器端创建一个负责监听IP地址跟端口号的socket
        Socket socketWatch = new Socket(AddressFamily.InterNetwork, Socket T)
        IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtServer.Text);
    //创建端口对象
        IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
    //监听
        socketWatch.Bind(point);
        ShowMsg("监听成功");
        socketwatch.Listen(10);//多于10个要排队
        Thread th = new Thread(Listen);//开启线程后窗体不卡死了,卸载函数中用线程执行。
        th.IsBackground = true;
        th.Start(socketWatch);
      }
      catch ()
        {

        }
      }
    ///<summary>
    ///等待客户端连接,并且创建与之通信的socket
    ///</summary>


      void Listen(object o)
      {
        Socket socketWatch = o as Socket;
    //等待客户端连接,并且创建一个负责通信的Socket
        while (true)
        {
          try{
            Socket socketSend = socketWatch.Accept();//如果客户端不连接,就会一直等待,阻碍主线程的运行。1、造成窗体假死的情况:开一个线程。2、只能连接一个客户端:写在循环里面
            ShowMsg(socketSend.remoteEndPoint.ToString() + ":" + "连接成功");
    //开启一个新线程不停地接收客户端发送过来的消息
            Thread th = new Thread(Recive);
            th.IsBackground = true;
            th.Start(socketSend);
           }
          catch ()
           {

           }
         }
      }

    ///<summary>
    ///服务器端不停地接收客户端发送过来的消息
    ///</summary>
      void Recive(object o)
      {
        Socket socketSend = o as Socket;
        while (true)
        {
          try{
    //客户端连接成功后,服务器应该接收客户端发来的消息
            byte[] buffer = new byte[1024 * 1024 * 2];
    //实际接收到的有效字节数
            int r = socketSend.Receive(buffer);//当客户端关闭了,接收的字节数为零,需判断客户端是否下线了
            if (r == 0)
              {
                break;
              }
          string str = Encoding.UTF8.GetString(buffer, 0, r);
          ShowMsg(socketSend.RemotteEndPoint + ":" + str);
          }
        catch ()
          {

          }

        }

      }

      void ShowMsg(string str)
      {
        txtLog.AppendText(str + " ");//文本框追加文本
      }

    //客户端
      namespace _07Client
      {
        public partial class Form1:Form

        {
          public Form1()
            {
              InitializeComponent();
            }
      Socket socketSend;

      private void btnStart_Click(object sender, EventArgs 2)
      {
    //创建负责通信的Socket
        socketSend = new Socket(AddressFamily.InterNetwork, SocketType flow, );
        IPAddress ip = IPAddress.Parse(txtServer.Text);
        IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
    //获得要连接的远程服务器应用程序的IP地址和端口号
        socketSend.Connect(point);
        showMsg("连接成功");
      }
      void showMsg(string str)
      {
        txtLog.AppendText(str + " ");
      }

    //客户端给服务器发送消息
      private void btnSend_Click(object sender, EventArgs e)
      {
        string str = txtMsg.Text.Trim();
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
        socketSend.send(buffer);
      }
     };
    }

  • 相关阅读:
    程序员修炼之道——从小工到专家 读书笔记
    Spring5 IOC原理
    2021下期末总结
    十年风雨,一个普通程序员的成长之路(五) 成长:得到与教训
    UmbracoXslDevelopmentTemplate CQ
    Asp.net中的数据绑定 CQ
    Building the DotNetNuke Module in Normal Asp.net Application CQ
    UmbracoDataTypeFirstGlance CQ
    Umbraco Home CQ
    UmbracoColor Picker–Demo CQ
  • 原文地址:https://www.cnblogs.com/lz-huihui/p/10765448.html
Copyright © 2011-2022 走看看