C \ # TcpListener 의 프로 그래 밍 요점
11148 단어 listener
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
namespace Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
listener = new TcpListener(IPAddress.Any, 9009);//
listener.Start();
// 1: tcp , 。 。
new Thread(() =>
{
while (true)
{
Thread.Sleep(100);//
if (!listener.Pending())
{
continue;
}
var client = listener.AcceptTcpClient();
//
// client.ReceiveBufferSize
// client.ReceiveTimeout
// client.SendBufferSize
// client.SendTimeout
if (!client.Connected)
{
continue;
}
streams.Add(client.GetStream());
}
}) { IsBackground = true }.Start();
// 2: , 。 。
new Thread(() =>
{
while (true)
{
Thread.Sleep(100);//
if (streams == null || streams.Count == 0)
{
continue;
}
streams = streams.Where(s => s.CanRead && s.CanWrite).ToList();
foreach (var stream in streams.Where(stream => stream.CanRead && stream.CanWrite))
{
AsyncReceiveBytes(stream,
s =>
{
// todo: result
// todo: , C#
AsyncSendBytes(s, new byte[0]); // todo: C# , new byte[0]。
});
}
}
}) { IsBackground = true }.Start();
}
//
public void SendEventAndTarget()
{
if (streams == null || streams.Count == 0)
{
return;
}
streams = streams.Where(s => s.CanRead && s.CanWrite).ToList();
foreach (var stream in streams.TakeWhile(stream => stream.CanWrite))
{
AsyncSendBytes(stream, new byte[0]);// todo: C# new byte[0]。
}
}
private static void AsyncReceiveBytes(NetworkStream stream,
Action<NetworkStream> callback)
{
// : , 。
// 。
//ThreadPool.SetMaxThreads(); 。
ThreadPool.QueueUserWorkItem(delegate
{
var buffer = new byte[1024];// 1024: 。
var result = new byte[0];
do
{
var a = stream.Read(buffer, 0, buffer.Length);
result = result.Concat(buffer.Take(a)).ToArray();
} while (stream.DataAvailable);
callback(stream);
});
}
private static void AsyncSendBytes(NetworkStream stream, byte[] bytes)
{
// : , 。
// 。
//ThreadPool.SetMaxThreads(); 。
ThreadPool.QueueUserWorkItem(delegate
{
try
{
stream.Write(bytes, 0, bytes.Count());
}
catch (Exception)
{
MessageBox.Show(" !");// 。
}
});
}
private readonly TcpListener listener;
//
private List<NetworkStream> streams = new List<NetworkStream>();
}
}
시간 을 내 서 프로젝트 에 응용 한 후에 다시 총 결 해 보 자.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
icrosoft Enterprise Listener에서 인증이 필요한 SMTP 서버를 사용하도록 설정icrosoft 엔터프라이즈 라이브러리의 로깅 모듈에는 Email Trace Listener가 있습니다.사이트를 다른 곳에 배치하는 응용에 있어서 이것은 매우 효과적인 기능이다.전자메일로 로그를 보고 우리가 개발한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.