Я пытаюсь узнать и написал код для 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 асинхронный.
Спасибо.