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, );// 端口根据需要确定
listener.Start(); // 后台线程1:用于接收tcp连接请求,并将网络流加入列表。随主线程的退出而退出。
new Thread(() =>
{
while (true)
{
Thread.Sleep();// 可以根据需要设置时间
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();// 可以根据需要设置时间
if (streams == null || streams.Count == )
{
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[]); // todo:将待响应的C#对象转换成字节数组,替换new byte[0]。
});
}
}
}) { IsBackground = true }.Start();
} // 发送事件和目标的入口
public void SendEventAndTarget()
{
if (streams == null || streams.Count == )
{
return;
}
streams = streams.Where(s => s.CanRead && s.CanWrite).ToList();
foreach (var stream in streams.TakeWhile(stream => stream.CanWrite))
{
AsyncSendBytes(stream, new byte[]);// todo:这里将待发送的C#对象转换的字节数组替换new byte[0]。
}
} private static void AsyncReceiveBytes(NetworkStream stream,
Action<NetworkStream> callback)
{
// 短时后台线程:用于处理网络流的读操作,处理完成后即归还线程池。
// 每个网络流都会分配一个线程。
//ThreadPool.SetMaxThreads();根据需要设置。
ThreadPool.QueueUserWorkItem(delegate
{
var buffer = new byte[];// 1024:根据需要进行设置。
var result = new byte[];
do
{
var a = stream.Read(buffer, , 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, , bytes.Count());
}
catch (Exception)
{
MessageBox.Show("远程主机主动断开此连接!");// 也可以做其它处理。
}
});
} private readonly TcpListener listener;
// 网络流列表
private List<NetworkStream> streams = new List<NetworkStream>();
}
}

找时间在项目中应用后,再总结一下。

C# TcpListener的编程要点的更多相关文章

  1. Java 编程要点之并发(Concurrency)详解

    计算机用户想当然地认为他们的系统在一个时间可以做多件事.他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流.即使是单一的应用程序通常也是被期望在一个时间来做多件事.例 ...

  2. [.NET] 《Effective C#》快速笔记 - C# 高效编程要点补充

    <Effective C#>快速笔记 - C# 高效编程要点补充 目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 ...

  3. 【转载】漫谈C++:良好的编程习惯与编程要点

    原文: 漫谈C++:良好的编程习惯与编程要点 阅读目录 以良好的方式编写C++ class Class with pointer member(s):记得写Big Three static与类 正文 ...

  4. 《Effective C#》快速笔记(六)- - C# 高效编程要点补充

    目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 四十九.实现与 CLS 兼容的程序集 五十.实现小尺寸.高内聚的程序集 这是 ...

  5. Blocks编程要点

    [老狼推荐]Blocks编程要点原文:Blocks Programming Topics链接:http://developer.apple.com/library/ios/#documentation ...

  6. VS2017 ATL创建ActiveX编程要点

    VS2017 ATL创建ActiveX控件编程要点: 一.创建vs项目需要安装器visual studio installer中: 安装 visual studio扩展开发中的 用于x86和x64的V ...

  7. Essential Java.《Java 编程要点》

    Essential Java.<Java 编程要点> Essential Java, is a book about the Essentials of Java Programming. ...

  8. 基础笔记(一):C#编程要点

    前言 来源于手中日常摘录的资料和书籍,算是对看过的东西的总结,部分注有阅读心得,也有部分只提出大纲或结论.(备注:本篇文章中大部分要点需要有实际的开发经验,有助于阅读理解.)     目录 const ...

  9. 漫谈C++:良好的编程习惯与编程要点

    以良好的方式编写C++ class 假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯. ① Header(头文件)中的防卫式声明 complex.h: # ifndef ...

随机推荐

  1. MongoDB(1):常用操作命令大全

    MongoDB常用操作命令大全(转) http://www.jb51.net/article/48217.htm 成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操 ...

  2. Linux下mysql编译安装

    一.下载安装包 因为编译安装mysql需要cmake所以先编译安装cmake,这里都一起下载下来 下载cmake,网址https://cmake.org/download/ 下载mysql,网址htt ...

  3. mysql 截取字符

    $where="(left(`type_id`,1)=1"; 返回 type_id 字段 从左边开始长度为1个字符 LEFT(str,len)返回字符串str的最左面len个字符. ...

  4. 最新hosts,更新hosts,可用

    点击这里,全选后复制,粘贴到C:\Windows\System32\drivers\etc的hosts里面,把原来的置换了

  5. [terry笔记]Oracle会话追踪(二):TKPROF

    接上一笔记[terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046 http://www.cnblogs.com/kkterry/p/3279282.html ...

  6. python Django 学习笔记(一)—— Django安装

    注:本人python版本2.7.5 ,win7系统 安装Django https://www.djangoproject.com/download/ 官方下载Django-1.5.5.tar.gz 1 ...

  7. Map和HashMap

    通过查询JDK帮助文档,我们可以得知Map的说明.方法等 import java.util.Map; import java.util.HashMap; class Test{ public stat ...

  8. Zygote(app_process)相关分析1

    首先我们从Init.c中来看,当Init中解析完init.rc文件时会得到一系列的action,通过action去调用一些函数. Zygote是在init.rc中service section中 se ...

  9. poj 1459 Power Network

    题目连接 http://poj.org/problem?id=1459 Power Network Description A power network consists of nodes (pow ...

  10. 九度oj 1541 二叉树

    原题链接:http://ac.jobdu.com/problem.php?pid=1541 简答题如下: #include<algorithm> #include<iostream& ...