zoukankan      html  css  js  c++  java
  • 网络编程Socket 异步发送接收

    using System.Net.Sockets;

    1.建立Socket 

    Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtoclType.UDP);

    说明:AddressFamily.InterNetwork 指定当前Socket采用Ipv4协议

              SocketType.Dgram 指定采用数据报通讯模式(锁定UDP /TCP)

              ProtoclType.UDP 指定采用UDP模式

    2.建立Endpoint,该对象包含IP和端口

    EndPoint localEP=new IPEndpoint(Address.Parse("127.0.0.1"),10020);

    说明: Address.Parse() 把字符串格式的IP转换成IPAddress对象,

               10020 端口 

    3.socket.Bind(localEP)

    说明:Socket对象绑定监听地址和端口

    4.建立State对象,目标是为了异步调用作为参数传入,并把当前的Socket传递给异步回调方法

    State state=new State(socket)

    State类定义如下:

    public class State{

      public byte[] Buffer{get;private set;}  //定义缓冲区

      public Socket Socket{get;private set;} //定义Socket属性

      public EndPoint RemoteEP;  //对方的网络信息

      public State(Socket socket)

      {

        this.Buffer=new byte[10240];  //初始化缓冲区大小为1k字节

        this.Socket=socket;//保存本地Socket对象

        this.RemoteEP=new IPEndPoint(IPAddress.Any,0);

      }

    }

    5.异步接收(本地Socket对象接收数据处理)

    socket.BeginReceive(state.Buffer,0,stateBuffer.Length,SocketFlags.None,new AsyncCllback(EndReceiveFromCallback),state);

    6.接收数据委托方法

    private static void EndReceiveFromCallback(IAsyncResult ar)

    {

       State state=ar.AsyncState as State;

       Socket socket=state.Socket;

       byte[] RecBakSendBytes=new byte[10240];//接收缓冲区大小

       try

       {

         int byteRead=socket.EndReceive(ar); //异步接收

         ar.AsyncWaitHandle.Close();//接收完毕后关闭端口

        if(byteRead>0)

        {

             string recStr=Encoding.default.GetString(state.Buffer,0,byteRead);

             ProcessJSON(recStr);

        }

       }

    }

    效果:

    完整源码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using WinNetTest.Net;
    namespace WinNetTest
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void groupBox1_Enter(object sender, EventArgs e)
    {

    }

    private void Form1_Load(object sender, EventArgs e)
    {
    NetHelper.Ip = tbIP.Text;
    NetHelper.RemoteIp = tbRIp.Text;
    NetHelper.Port = Int32.Parse(tbPort.Text);
    NetHelper.RemotePort = Int32.Parse(tbRPort.Text);
    NetHelper.ProcessJSON += (string msg) => {
    this.tbRecevied.Invoke((Action)delegate
    {
    this.tbRecevied.Text = msg;
    });
    };
    }

    private void btnStart_Click(object sender, EventArgs e)
    {
    NetHelper.RecvThread();
    btnStart.Enabled = false;
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
    NetHelper.SendMsg(tbSendContent.Text);
    }
    }
    }

    NetHelper.cs

    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.Xml;
    using WinNetTest.Net;
    namespace WinNetTest.Net
    {
    public static class NetHelper
    {
    public static event Action<XmlNode> InEvp;
    public static event Action<string> ProcessJSON;
    public static int Port { get; set; }
    public static string Ip { get; set; }
    public static int RemotePort { get; set; }
    public static string RemoteIp { get; set; }
    /// <summary>
    /// 侦听接收数据
    /// </summary>
    public static void RecvThread()
    {
    try
    {
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    EndPoint localEP = new IPEndPoint(IPAddress.Parse(Ip), Port);
    socket.Bind(localEP);
    State state = new State(socket);
    socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveFromCallback), state);
    }
    catch (Exception ex)
    {

    }
    }

    public static void SendMsg(string sendStr)
    {
    UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any,0));
    IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(RemoteIp), RemotePort);
    byte[] buf = Encoding.Default.GetBytes(sendStr);
    client.Send(buf, buf.Length, endpoint);
    }

    private static void EndReceiveFromCallback(IAsyncResult ar)
    {
    State state = ar.AsyncState as State;
    Socket socket = state.Socket;
    byte[] RecBakSendBytes = new byte[10240];
    try
    {
    int byteRead = socket.EndReceive(ar);
    ar.AsyncWaitHandle.Close();
    if (byteRead > 0)
    {
    string recStr = Encoding.Default.GetString(state.Buffer, 0, byteRead);
    LogHelper.WriteLog(recStr);
    ProcessJSON(recStr);
    }
    }
    catch (Exception ex)
    {

    }
    finally
    {
    socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveFromCallback), state);
    }
    }
    }
    }

    State.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net.Sockets;
    using System.Net;
    namespace WinNetTest.Net
    {
    public class State
    {
    public byte[] Buffer { get; private set; }
    public Socket Socket { get; private set; }
    public EndPoint RemoteEP;
    public State(Socket socket)
    {
    this.Buffer = new byte[10240];
    this.Socket = socket;
    this.RemoteEP = new IPEndPoint(IPAddress.Any, 0);

    }
    }
    }

    LogHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    namespace WinNetTest.Net
    {
    public class LogHelper
    {
    public static void WriteLog(string content, string filename = "log") {
    string dir=Environment.CurrentDirectory+"\"+filename;
    if (!Directory.Exists(dir))
    {
    Directory.CreateDirectory(dir);
    }
    string path = dir + "\" + DateTime.Now.ToString("yyyyMMdd")+".txt";
    if (!File.Exists(path)) {
    File.CreateText(path);
    }
    using (FileStream fs = new FileStream(path,FileMode.Append,FileAccess.Write,FileShare.None))
    {
    using (StreamWriter sw = new StreamWriter(fs))
    {
    sw.WriteLine("时间:" + DateTime.Now.ToLongTimeString());
    sw.WriteLine(content);
    sw.Flush();
    }
    }

    }
    }
    }

  • 相关阅读:
    navicat连接腾讯云服务器mysql
    腾讯云服务器部署1
    域名的注册使用
    python入门1-3章节
    轮播图的实现
    前端起步
    redis部署到云服务器上的一些坑
    面向对象第三单元总结
    面向对象课程第二单元总结
    面向对象课程第一单元总结
  • 原文地址:https://www.cnblogs.com/sundh1981/p/13404891.html
Copyright © 2011-2022 走看看