zoukankan
html css js c++ java
C# server socket 异步编程
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Net;
using
System.Net.Sockets;
using
System.Threading;
namespace
ScoketProxy
{
class
ZServer
{
ManualResetEvent clientConnected
=
new
ManualResetEvent(
false
);
TcpListener tl;
public
ZServer(
int
port)
{
tl
=
new
TcpListener(port);
}
~
ZServer()
{
tl.Stop();
}
public
void
Listen()
{
tl.Start(
5
);
clientConnected.Reset();
while
(
true
)
{
tl.BeginAcceptTcpClient(
new
AsyncCallback(OnAccept), tl);
clientConnected.WaitOne();
}
}
void
OnAccept(IAsyncResult ar)
{
TcpListener listener
=
(TcpListener)ar.AsyncState;
TcpClient client
=
listener.EndAcceptTcpClient(ar);
TcpClient tranform
=
new
TcpClient(
"
220.181.5.97
"
,
80
);
NetworkStream cns
=
client.GetStream();
NetworkStream tns
=
tranform.GetStream();
while
(client.Connected)
{
//
byte[] cbuf = ReadBlock(client);
//
tns.Write(cbuf, 0, cbuf.Length);
//
byte[] tbuf = ReadBlock(tranform);
//
cns.Write(tbuf,0,tbuf.Length);
byte
[] cbuf
=
ReadBlock(client);
SendBlock(client, cbuf);
byte
[] tbuf
=
ReadBlock(tranform);
SendBlock(tranform, tbuf);
}
//
TcpListener listener = (TcpListener)ar.AsyncState;
//
TcpClient client = listener.EndAcceptTcpClient(ar);
//
clientConnected.Set();
//
while(true)
//
{
//
string s = ReadLine(client);
//
if (s == "exit")
//
{
//
Console.WriteLine("bye");
//
break;
//
}
//
byte[] buf = GetBytes(s);
//
client.GetStream().Write(buf,0,buf.Length);
//
}
//
return;
}
byte
[] GetBytes(
string
s)
{
return
System.Text.Encoding.UTF8.GetBytes(s.ToCharArray());
}
string
GetString(
byte
[] bs)
{
return
System.Text.Encoding.UTF8.GetString(bs);
}
string
ReadLine(TcpClient client)
{
StringBuilder sb
=
new
StringBuilder();
NetworkStream ns
=
client.GetStream();
while
(
true
)
{
byte
[] buf
=
new
byte
[client.Available];
ns.Read(buf,
0
, buf.Length);
string
s
=
GetString(buf);
if
(s
==
"
\r\n
"
)
{
break
;
}
sb.Append(s);
}
return
sb.ToString();
}
byte
[] ReadBlock(TcpClient client)
{
System.Collections.Generic.List
<
byte
>
r
=
new
List
<
byte
>
();
while
(client.GetStream().DataAvailable)
{
byte
[] buf
=
new
byte
[
1
];
client.GetStream().Read(buf,
0
, buf.Length);
r.Add(buf[
0
]);
}
return
r.ToArray();
}
int
SendBlock(TcpClient c,
byte
[] buf)
{
c.GetStream().Write(buf,
0
, buf.Length);
return
buf.Length;
}
}
}
查看全文
相关阅读:
Spacemacs配置yasnippe插件
设置SSH只允许指定IP才能访问
firewall的规则设置与命令(白名单设置)
Docker存储驱动介绍
elasticsearch启动常见错误
ES系列:解决Exception in thread “main” java.nio.file.AccessDeniedException: /usr/local/elasticsearch
ELK6.3.2搭建配置文件篇(filebeat版)
Linux:sudo,没有找到有效的 sudoers 资源。
Filebeat安装及使用
elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
原文地址:https://www.cnblogs.com/zyip/p/1450590.html
最新文章
1-STM32+Air724UG基本控制篇(自建物联网平台)-硬件使用说明
atomic.Value代替sync.RWMutex
【Go】原子操作atomic.Value的使用
Go 语言标准库中 atomic.Value 的前世今生
logstash日志写到es,按照时间来进行切割,生成索引配置
HTTP/2和HTTP/1.1的比较
如何作废一个已发布的Go module版本,我来告诉你!
亿级流量架构之网关设计思路、常见网关对比
mysql索引优化策略有哪些
Mysql什么是回表查询和覆盖索引
热门文章
在 MongoDB 中使用覆盖索引查询
有思想的人
视频编码AVC中High、Baseline、Main、High@L4.0、High@L5.1、main10
Springboot中参数设置与获取之@Value、Environment、properties、profile
全网最全 《电脑爱好者》(1993-2019)全套pdf电子版[收藏]
谁才是简书江湖的倚天剑和屠龙刀?(钻、贝、卡、FTN)
怎么通过SEO建网站赚钱?
babel深入教程(babel7版本)
PowerJob 应对庞大任务的锦囊妙计:MapReduce
Java 序列化界新贵 kryo 和熟悉的“老大哥”,就是 PowerJob 的序列化方案
Copyright © 2011-2022 走看看