C # Tcp Асинхронное программирование - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь узнать и написал код для TCP-соединения.Это мой класс сервера:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace Tcp
{
    public class Server
    {
        #region Constructor
        public Server()
        {

        }
        #endregion

        #region Field

        //Server Socket        
        public Socket SrvSocket;
        //Server Port
        private int _socketPort = 8080;
        byte[] byteData = new byte[1024];
        #endregion


        #region Properties
        /// <summary>
        /// Socket Port Int Value
        /// </summary>
        public int SocketPort
        {
            get
            {
                return _socketPort;
            }
            set
            {
                _socketPort = value;
            }
        }
        #endregion


        #region Method
        public void Close()
        {
            SrvSocket.Shutdown(SocketShutdown.Both);
        }

        /// <summary>
        /// Open TCP Socket
        /// </summary>
        public void Connect()
        {
            try
            {
                SrvSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any,_socketPort);
                SrvSocket.Bind(ipEndPoint);
                SrvSocket.Listen(4);
                SrvSocket.BeginAccept(new AsyncCallback(OnAccept), null); //TODO : تست کنم State را یک بار سوکت بگذارم یکبار State خودم
            }
            catch (SocketException ex)
            {
                MessageBox.Show(@"Socket Exception trown : " + ex.Message);
            }
            catch (TimeoutException ex)
            {
                MessageBox.Show(@"Timeout Exception trown : " + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(@"Exception trown : " + ex.Message);
            }
        }

        public void OnAccept(IAsyncResult ar)
        {
            try
            {
                Socket ClntSocket = SrvSocket.EndAccept(ar); // روند تایید انجام شد.

                SrvSocket.BeginAccept(new AsyncCallback(OnAccept), null); // ممکنه کلاینت های دیگه هم بخواند وصل بشند

                //SocketState state = new SocketState(); // وضعیت پورت تنظیم میکنیم

                ClntSocket.BeginReceive(byteData, 0, byteData.Length
                    , SocketFlags.None,new AsyncCallback(OnReceive), ClntSocket); // شروع به دریافت میکنیم


            }
            catch (Exception ex)
            {

                MessageBox.Show(@"On Accept Exception trown : " + ex.Message);
            }
        }
        #endregion

        public void OnReceive(IAsyncResult ar)
        {
            try
            {
                Socket ClntSocket = (Socket)ar.AsyncState;
                int byteReades = ClntSocket.EndReceive(ar);

                if (byteReades > 0)
                {
                    var collectedData = Encoding.ASCII.GetString(byteData, 0, byteReades);
                    Console.WriteLine(collectedData);
                }

                ClntSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), ClntSocket);
            }
            catch (Exception ex)
            {
                MessageBox.Show(@"On receive Exception trown : " + ex.Message);
            }
        }
        public void Send(string data)
        {
            //var sendData = Encoding.ASCII.GetBytes(data);

            //IPEndPoint ConToSocket = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 8080);

            //TcpClient Client = new TcpClient(ConToSocket);
            //Client.
        }
        public void OnSend(IAsyncResult ar)
        {

        }
    }
    public class SocketState
    {
        public Socket TransferSocket = null;
        /// <summary>
        /// Buffer Size
        /// </summary>
        public const int bufferSize = 1024;
        /// <summary>
        /// Recieved byte
        /// </summary>
        public byte[] buffer = new byte[bufferSize];
        /// <summary>
        /// Offset
        /// </summary>
        public int offset = 0;
    }
}

Первый вопрос: почему я могу подключиться к серверу только один раз?

Я использую telnet для подключения к серверу на локальном ПК. Когда я открываю больше telnet, не останавливайте всю отправку!

И это мой класс клиента:

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.Windows.Forms;
namespace Tcp
{
    class Client
    {
        Socket ClientSocket = null;
        public void Connect(string RemoteIp, int RemotePort)
        {
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint RemoteSrv = new IPEndPoint(IPAddress.Parse(RemoteIp), RemotePort);
            ClientSocket.BeginConnect(RemoteSrv, new AsyncCallback(OnConnect), null);
        }
        public void OnConnect(IAsyncResult ar)
        {
            try
            {
                ClientSocket.EndConnect(ar);
            }
            catch (Exception ex)
            {

                MessageBox.Show("Exp Thrown OnConnect : " + ex.Message);
            }
        }

        public void Send(string str)
        {
            byte[] data = Encoding.ASCII.GetBytes(str);
            ClientSocket.BeginSend(data,0,data.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
        }
        public void OnSend(IAsyncResult ar)
        {
            try
            {
                ClientSocket.EndSend(ar);
            }
            catch (Exception ex )
            {

                MessageBox.Show("Exp Thrown OnSend : " + ex.Message);
            }
        }

    }
}

Когда я подключаюсь к серверу и вижу состояние сокета в точке подключения, подключенный сокет не является 8080!Это неправильно ?И сервер не может вернуть полученные данные в Console.Writeline, Где моя проблема?

var собранийData = Encoding.ASCII.GetString (byteData, 0, byteReades);Console.WriteLine (collectData);

Почему я не могу получить форму моего класса клиента!

Наконец, мне нужно решение, чтобы узнать лучший способ отправки / получения связи между моим компьютером и устройствомчерез TCP асинхронный.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...