理解 Socket连接过程的 三个步骤:服务器监听,客户端请求,连接确认。但具体到代码 不知道怎么去用

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;//引用IPEndPoint命名空间
    using System.Net.Sockets;//引用TcpListener命名空间
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;namespace Demo_7_2_Service
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }        TcpListener tcp;
            bool isClosing;
            private void btnConnect_Click(object sender, RoutedEventArgs e)
            {
                //try
                //{                if (btnConnect.Content.ToString() == "连接")
                    {
                        //定实例化终端节点,默认侦听端口8081
                        IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(txtIp.Text), Convert.ToInt32(txtPort.Text));
                        //实例化侦听TCP
                        tcp = new TcpListener(ipe);
                        //开启侦听
                        tcp.Start();
                        //绑定异步连接
                        tcp.BeginAcceptSocket(new AsyncCallback(AcceptSocketCB), tcp);
                        isClosing = false;
                        btnConnect.Content = "断开";
                    }
                    else
                    {
                        //关闭侦听
                        isClosing = true;
                        tcp.Stop();
                        btnConnect.Content = "连接";
                    }
                //}
                //catch (Exception ex)
                //{
                //    MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                //}
            }//实例化用于接收数据的byte数组
            static byte[] buff = new byte[60000];
            private void AcceptSocketCB(IAsyncResult ar)
            {
                if (!isClosing)
                {
                    //获取异步信息
                    TcpListener tcp = (TcpListener)ar.AsyncState;
                    //异步连接
                    Soc = (Socket)tcp.EndAcceptSocket(ar);
                    //绑定异步接收数据
                    Soc.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(Receive), Soc);
                    //绑定异步连接
                    tcp.BeginAcceptSocket(new AsyncCallback(AcceptSocketCB), tcp);
                }
            }
            //客户端套接字
            Socket Soc = null;
            private void Receive(IAsyncResult ar)
            {
                if (!isClosing)
                {
                    //保存客户端套接字
                    Socket soc = (Socket)ar.AsyncState;
                    int i = 0;
                    try
                    {
                        //异步状态读取
                        i = soc.EndReceive(ar);
                        //Soc = null;
                    }
                    catch { }                if (i != 0)
                    {
                        string readData_str = Encoding.Default.GetString(buff).Replace("\0","");
                        //显示报警信息
                        Dispatcher.Invoke(new Action(() => {
                            lblState.Content = readData_str;
                        }));
                        
                        buff = new byte[60000];
                        //绑定异步接收数据
                        soc.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(Receive), soc);
                    }
                }
            }
        }
    }
      

  2.   

    没有大的区别,都是接受来自客户端的连接。如果你希望 TcpListener 接受到的连接是 TcpClient 形式的,就i选用 BeginAcceptTcpClient 
    如果你希望 TcpListener 接受到的连接是 Socker 形式的,就i选用 BeginAcceptTcpSocket
      

  3.   

    我看MSDN上 这两种方法作用相同
    https://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcplistener.beginacceptsocket(v=vs.80).aspx
    https://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcplistener.beginaccepttcpclient(v=vs.80).aspx 请问TcpClient 的形式和Socker 的形式有什么区别 我是小白 谢谢
      

  4.   

    http://bbs.csdn.net/topics/90229137
      

  5.   

    Socket 是为了兼容 unix 系列传统的接口的。TcpClient/TcpListener 是微软为 windows 而设计的、实现了 IOCP 的机制。你编程中应该使用后者,而不是 Socket。虽然在后者中使用到了 Socket 对象,但是后者底层并不是对前者的封装(!),后者是完全重新设计开发的机制。
      

  6.   

    楼上 
    “你编程中应该使用后者,而不是 Socket。虽然在后者中使用到了 Socket 对象,但是后者底层并不是对前者的封装(!),后者是完全重新设计开发的机制。”
    不理解这句话
      

  7.   

    TCP是传输层协议
    Socket是对TCP协议的一个封装