2016-06-29 58 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