Мне нужно реализовать клиентский сокет tcp. Мы должны получать данные с сервера tcp сокета с определенным временным интервалом. Если мы сделали запрос соединения от клиента, тогда соединение не будет отключено. Мы должны получать данные всякий раз, когда сервер отправляет данные. Я пробовал асинхронную связь с клиентом с веб-сайта MSDN. Но функция обратного вызова Receive вызывается внутри метода получения. Поэтому мы должны получать данные с сервера без какого-либо интервала. Если данные не принимаются непрерывно, соединение будет отправлено на принятое, а соединение отключено.Непрерывно читайте данные с сервера tcp с заданным интервалом времени
Может кто-нибудь мне помочь ... Спасибо inadvance
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Configuration;
using System.Net;
using System.IO;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Transactions;
namespace ClientSocket
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = 5176;
public byte[] buffer = new byte[BufferSize];
public StringBuilder sb = new StringBuilder();
}
public class AsynchronousClient
{
public const int port = 8095;
public static ManualResetEvent connectDone =
new ManualResetEvent(false);
public static ManualResetEvent sendDone =
new ManualResetEvent(false);
public static ManualResetEvent receiveDone =
new ManualResetEvent(false);
public static String response = String.Empty;
public static void StartClient()
{
try
{
IPAddress ipAddress = IPAddress.Parse("192.168.1.89");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
Socket client = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
client.BeginConnect(remoteEP,
new AsyncCallback(ConnectCallback), client);
connectDone.WaitOne();
client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
//Send(client, Msg + "<EOF>");
//sendDone.WaitOne();
Receive(client);
receiveDone.WaitOne();
MessageBox.Show(response, "Final Response received");
//Send(client, "Data From Client" + "<EOF>");
//sendDone.WaitOne();
//client.Shutdown(SocketShutdown.Both);
//client.Close();
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
//finally
//{
// response = string.Empty;
//}
}
public static void ConnectCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
client.EndConnect(ar);
MessageBox.Show(string.Concat("Socket connected to ",
client.RemoteEndPoint.ToString()));
connectDone.Set();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public static void Receive(Socket client)
{
try
{
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public static void ReceiveCallback(IAsyncResult ar)
{
MessageBox.Show("Receivecallback");
StateObject state = (StateObject)ar.AsyncState;
state.sb.Clear();
Socket client = state.workSocket;
try
{
// Read data from the remote device.
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
MessageBox.Show(state.sb.ToString(), "Data");
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
else
{
//if (state.sb.Length > 1)
//{
// response = state.sb.ToString();
//}
//////Send(client, "NG", "Error");
//receiveDone.Set();
client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
//state.sb.Clear();
}
}
catch (Exception e)
{
Send(client, "NG", e.Message.ToString());
MessageBox.Show(e.ToString());
}
}
public static void Send(Socket client, String data, String ErrorMessage)
{
byte[] Status = Encoding.ASCII.GetBytes(data);
byte[] errorMessage = Encoding.ASCII.GetBytes(ErrorMessage);
byte[] statusSize = new byte[240];
int i = new int();
foreach (var ST in Status)
{
i++;
if (i == 1)
statusSize[0] = ST;
if (i == 2)
statusSize[1] = ST;
}
if (data.Equals("NG"))
{
int j = 2;
foreach (byte em in errorMessage)
{
statusSize[j] = em;
j++;
}
}
client.BeginSend(statusSize, 0, statusSize.Length, 0,
new AsyncCallback(SendCallback), client);
}
public static void SendCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
int bytesSent = client.EndSend(ar);
MessageBox.Show(string.Concat("Sent bytes to server.", bytesSent.ToString()));
//SocketConnected(client);
sendDone.Set();
//MessageBox.Show("Send Callback");
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public static bool SocketConnected(Socket s)
{
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 && part2)
return false;
else
return true;
}
}
private void btnConnect_Click(object sender, EventArgs e)
{
AsynchronousClient.StartClient();
}
}
}
}
Я думаю, вы уже начали реализовывать такую временную процедуру. Не хотите ли вы опубликовать его? Это будет хорошей отправной точкой. –
Я прикрепил свой код.it получает только первый ответ. Если сервер отправляет данные через некоторое время, то как я могу получить эти данные из этого кода. – user6290752
может кто-нибудь мне помочь, основываясь на приведенном выше коде. – user6290752