2016-11-04 2 views
-1

Мне нужно реализовать клиентский сокет 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(); 
     } 



     } 

    } 
} 
+0

Я думаю, вы уже начали реализовывать такую ​​временную процедуру. Не хотите ли вы опубликовать его? Это будет хорошей отправной точкой. –

+0

Я прикрепил свой код.it получает только первый ответ. Если сервер отправляет данные через некоторое время, то как я могу получить эти данные из этого кода. – user6290752

+0

может кто-нибудь мне помочь, основываясь на приведенном выше коде. – user6290752

ответ

0

Создать сокет клиента в новом потоке, а затем начать чтение для навсегда.

using System; 
using System.Threading; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Collections; 

namespace TCPClient 
{ 
class TCPClient 
{ 

    [STAThread] 
    static void Main(string[] args) 
    { 
     TCPClient client = null; 
     client = new TCPClient("filename"); 

    } 

    private String m_fileName=null; 
    public TCPClient(String fileName) 
    { 
     m_fileName=fileName; 
     Thread t = new Thread(new ThreadStart(ClientThreadStart)); 
     t.Start(); 
    } 

    private void ClientThreadStart() 
    { 
     Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"),31001)); 

     // Send some data if erquired. 
     clientSocket.Send(Encoding.ASCII.GetBytes("testdata")); 

     // Receive the data whenver available. 
     while(1) 
     { 
     byte [] data = new byte[1024]; 
     clientSocket.Receive(data); 
     int length=BitConverter.ToInt32(data,0); 

    //check if you have received all the data and sleep for time interval. with Sleep(timeInterval), Do only after you have received all available data for instance. 
     } 

     clientSocket.Close(); 
    } 

} 

}

+0

Вы никогда не должны спать в цикле приема. Это в конечном итоге переполнит буфер приема или может заблокировать сервер при отправке. –

+0

@JeroenvanLangen спасибо! Вы правы, он может переполнить буфер приема. но не будет блокировать сервер. потому что сервер tcp не ждет, пока клиент получит все данные. Я буду соответствующим образом изменять ответ. (Y) – Darshana

+1

Да, он может блокировать сервер, поскольку TCP - это поток. Когда буфер приема будет заполнен, сервер получит сообщение (tcp layer), что клиент получает буфер, заполнен (что-то с размером окна tcp set size), а сервер (если реализована блокировка (по умолчанию)) блокирует выполнение , –

0

Вы проблема в том, что для приема, другая сторона определившая, сколько и когда он будет посылать данные. Вы должны создать какое-то сообщение запроса, но вы должны продолжать получать.

  • Поэтому отправьте серверу запрос данных с интервалом.
  • Продолжает получать.
Смежные вопросы