2016-06-29 86 views
1

我試圖通過Windows服務從套接字接收數據,但是當我建立連接時,它變爲即時。我想不斷收到它(當端口關閉時它會斷開連接)。我怎樣才能做到這一點?如何連續從套接字接收數據?

這是我現在的輸出;

「GET/HTTP/1.1

主機:127.0.0.1:1994

連接:保持活着

緩存控制:最大年齡= 0

升級不安全-Requests:1

User-Agent:Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/51.0.2704.106 Safari/537.36

接受:text/html的,應用/ XHTML + xml的,應用/ XML; Q = 0.9,圖像/ WEBP,/; Q = 0.8

接受編碼:gzip,放氣,SDCH

Accept-Language:tr-TR,tr; q = 0.8,en-US; q = 0.6,en; q = 0.4

連接繼續嗎?假」

using System; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.Linq; 
using System.Threading; 
using System.Net.Sockets; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.ServiceProcess; 
using System.Collections.Generic; 

namespace AServiceTest 
{ 
    public partial class Service1 : System.ServiceProcess.ServiceBase 
    { 
     Thread th; 
     bool isRunning = false; 
     byte[] bytes = new byte[1024]; 

     public Service1() 
     { 
      InitializeComponent(); 
     } 
     protected override void OnStart(string[] args) 
     { 
      th = new Thread(DoThis); 
      th.Start(); 
      isRunning = true;    
     } 
     private void DoThis() 
     { 
      while (isRunning) 
      { 
        Socket listener, connecter, acc; 
        listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
        connecter = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Variables 

        listener.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1994)); 
        listener.Listen(0); 

        acc = listener.Accept(); //Accepting comm with client part 
        bool IsConnected = !((listener.Poll(1000, SelectMode.SelectRead) && (listener.Available == 0)) || !listener.Connected); 

        File.AppendAllText(@"D:\Tasks\dataGathering.txt", Environment.NewLine + "Connection proceed?1 " + IsConnected); 


       new Thread(() => 
       { 

        byte[] bytes = new byte[1024]; 
        int byteCount = acc.Receive(bytes, SocketFlags.None); 

        File.AppendAllText(@"D:\Tasks\dataGathering.txt", Environment.NewLine + "Connection proceed?2 " + IsConnected); 

        Console.WriteLine(Encoding.UTF8.GetString(bytes)); //It encodes before writing to the screen 
        File.AppendAllText(@"D:\Tasks\dataGathering.txt", Environment.NewLine + " " + Encoding.UTF8.GetString(bytes)); 

        File.AppendAllText(@"D:\Tasks\dataGathering.txt", Environment.NewLine + "Connection proceed?3 " + IsConnected); 


        File.AppendAllText(@"D:\Tasks\dataGathering.txt", Environment.NewLine + "Connection proceed? " + IsConnected); 
        Console.WriteLine("Does connection proceeding? " + IsConnected); 

       }).Start(); 
      } 
     }   
     protected override void OnStop() 
     { 
      isRunning = false; 
      th = null; 
     } 
     private void InitializeComponent() 
     { 
      this.ServiceName = "AServiceTest"; 
      this.CanStop = true; 
      this.AutoLog = false; 
      this.EventLog.Log = "Application"; 
      this.EventLog.Source = "Service1"; 
     } 
    } 
} 

回答

3

爲了不斷接收數據,你實際上需要把一些循環

例如:

private void StartProcessing(Socket serverSocket) 
{ 
    var clientSocket = serverSocket.Accept(); 
    StartReceiveing(clientSocket); 
} 

private void StartReceiveing(Socket clientSocket) 
{ 
    const int maxBufferSize = 1024; 

    try 
    { 
     while (true) 
     { 
      var buffer = new byte[maxBufferSize]; 

      var bytesRead = clientSocket.Receive(buffer); 

      if (ClientIsConnected(clientSocket)) 
      { 
       var actualData = new byte[bytesRead]; 

       Array.Copy(buffer, actualData, bytesRead); 
       OnDataReceived(actualData); 
      } 
      else 
      { 
       OnDisconnected(clientSocket); 
      } 
     } 
    } 
    catch (SocketException ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

private void OnDisconnected(Socket issuedSocket) 
{ 
    if (issuedSocket != null) 
    { 
     issuedSocket.Shutdown(SocketShutdown.Both); 
     issuedSocket.Close(); 

     StartProcessing(listener); 
    } 
} 

private void OnDataReceived(byte[] data) 
{ 
    //do cool things 
} 

private static bool ClientIsConnected(Socket socket) 
{ 
    return !(socket.Poll(1000, SelectMode.SelectRead) && socket.Available == 0); 
} 

而且,你的情況,我認爲閱讀socket async API和有關任務和異步編程,你可以做一些很酷和乾淨的東西,如:

await Task.Factory.FromAsync(serverSocket.BeginAccept, result => serverSocket.EndAccept(result), serverSocket); 

哪些不會阻止您的當前Thread