C# TcpListener的编程要点
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的编程要点的更多相关文章
- Java 编程要点之并发(Concurrency)详解
计算机用户想当然地认为他们的系统在一个时间可以做多件事.他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流.即使是单一的应用程序通常也是被期望在一个时间来做多件事.例 ...
- [.NET] 《Effective C#》快速笔记 - C# 高效编程要点补充
<Effective C#>快速笔记 - C# 高效编程要点补充 目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 ...
- 【转载】漫谈C++:良好的编程习惯与编程要点
原文: 漫谈C++:良好的编程习惯与编程要点 阅读目录 以良好的方式编写C++ class Class with pointer member(s):记得写Big Three static与类 正文 ...
- 《Effective C#》快速笔记(六)- - C# 高效编程要点补充
目录 四十五.尽量减少装箱拆箱 四十六.为应用程序创建专门的异常类 四十七.使用强异常安全保证 四十八.尽量使用安全的代码 四十九.实现与 CLS 兼容的程序集 五十.实现小尺寸.高内聚的程序集 这是 ...
- Blocks编程要点
[老狼推荐]Blocks编程要点原文:Blocks Programming Topics链接:http://developer.apple.com/library/ios/#documentation ...
- VS2017 ATL创建ActiveX编程要点
VS2017 ATL创建ActiveX控件编程要点: 一.创建vs项目需要安装器visual studio installer中: 安装 visual studio扩展开发中的 用于x86和x64的V ...
- Essential Java.《Java 编程要点》
Essential Java.<Java 编程要点> Essential Java, is a book about the Essentials of Java Programming. ...
- 基础笔记(一):C#编程要点
前言 来源于手中日常摘录的资料和书籍,算是对看过的东西的总结,部分注有阅读心得,也有部分只提出大纲或结论.(备注:本篇文章中大部分要点需要有实际的开发经验,有助于阅读理解.) 目录 const ...
- 漫谈C++:良好的编程习惯与编程要点
以良好的方式编写C++ class 假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯. ① Header(头文件)中的防卫式声明 complex.h: # ifndef ...
随机推荐
- discuz 模拟批量上传附件发帖
discuz 模拟批量上传附件发帖 简介 对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程.如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程. 插件地址 h ...
- Nob畅想在线教育
1.社交网络的课堂实时互动 老师上课,每当和同学们互动时大家下边总是保持沉默,低着头,几乎每人拿着一部手机在看,还有pad等. 张星老师的课算是好一点,学生可以抬着头然后手下边捏着手机,时不时低头看一 ...
- MIS2000 Lab,我的IT人生与职场--从零开始的前十五年 与 我的微创业
http://www.dotblogs.com.tw/mis2000lab/archive/2014/09/16/ithome_2014_ironman.aspx [IT邦幫忙]鐵人賽 -- MIS2 ...
- Javascript 插件统一的实现步骤
步骤: // 1. 定义立即调用的函数 +function($){ "use strict"; //使用严格模式ES5支持 //后续步骤 // 2. xx 插件类及原型方法的定义 ...
- 配置《算法 第四版》的Eclipse开发环境
1. 安装JAVA JAVA网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 配置环境变量(我把JAVA安装在 ...
- ios 总结
1 ocoa Touch Layer{ App Extensions https://developer.apple.com/library/ios/documentation/General/Con ...
- [笔记]--Oracle 10g在Windows 32位系统使用2G以上内存
1.修改c:\boot.ini文件 打开boot.ini文件,我的电脑->属性->高级->启动和恢复->编辑,设置在最后一行末尾添加/PAE选项后如下: [boot loade ...
- 菜鸟学习Hibernate——简单的增、删、改、查操作
上篇博客利用Hibernate搭建起一个简单的例子,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述如何利用Hinbernate框架实现简单的数据库操作. 1.加入junit.jar 2.新建 ...
- Linux中JDK环境变量的配置
在JDK安装好以后,需要进行环境变量的配置 配置目录 /etc/profile 在这个文件的末尾追加 JAVA_HOME=/home/j2sdk1.4.2_11PATH=$PATH:/home/j ...
- oracle - redo 损坏或删除处理方法
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...