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;
}
}
}
查看全文
相关阅读:
Linux终端复用——tmux
python中的global和nonlocal
Pytorch中的错误和bug
vue之Mutations 理解
js 对象的合并(3种方法)转载
json 数组
vue-cli 安装时 npm 报错 errno -4048
vue-cli 安装步骤(转载)
安卓输入框调起键盘后输入框自动上浮
jquery on 事件嵌套 事件执行多次
原文地址:https://www.cnblogs.com/zyip/p/1450590.html
最新文章
EFK项目操作(待完善)
EFK架构图
ESXi
MySQL-SQL语句
MySQL基本用法
脚本概述
shell一键部署nginx+tomcat
ELK的简单搭建
ELK架构图
安装部署MySQL主从复制
热门文章
企业日常巡检shell脚本
lvs+keepalived+nginx
LVS+Keepalived-DR模式(Apache)
Java笔记
LaTeX配置:Win10+TeXLive2018+VSCode+LaTexWorkshop
python 刷题中的细节
python之文件I/O
python中使用指定GPU
python中的常用技巧
Pytorch中的RNN之pack_padded_sequence()和pad_packed_sequence()
Copyright © 2011-2022 走看看