【问题标题】:How can I receive data from socket continuously?如何从套接字连续接收数据?
【发布时间】:2016-06-29 06:38:14
【问题描述】:

我正在尝试通过 Windows 服务从套接字接收数据,但是当我建立连接时,它变得即时。我想不断地接收它(端口关闭时它会断开连接)。我怎样才能做到这一点?

这是我现在的输出;

"GET/HTTP/1.1

主机:127.0.0.1:1994

连接:保持活动

缓存控制:max-age=0

升级不安全请求:1

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/51.0.2704.106 Safari/537.36

接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

接受编码:gzip、deflate、sdch

接受语言: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";
        }
    }
}

【问题讨论】:

    标签: c# visual-studio-2010 sockets service


    【解决方案1】:

    要连续接收数据,您实际上需要放入一些循环。

    例如:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 2018-10-02
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      相关资源
      最近更新 更多