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;
}
}
}
查看全文
相关阅读:
Delphi实现文件关联
用Delphi实现文件关联
Delphi 7使用自定义图标关联文件类型
redux-form的学习笔记
妙用 `package.json` 快速 `import` 文件(夹)
【webpack2】-- 入门与解析
黑科技:CSS定制多行省略
DOM操作和样式操作库的封装
webstorm 2016 激活破解
js/jq仿window文件夹框选操作插件
原文地址:https://www.cnblogs.com/zyip/p/1450590.html
最新文章
cookie理解
session再次理解
一个线程启动另一个线程或者一堆线程
springboot多环境配置
一些经验数据来探索在线服务
Upstart概述引导方法事件驱动的任务和服务
直接通过浏览器打开Android App 应用
BZOJ 3265 志愿者招募增强版 单
设计模式
Jafka来源分析——文章
热门文章
NSString、NSMutableString基本使用
[WebGL入门]十四,绘制多边形
nodejs保存文件的问题
springMVC3学习(八)--全球异常处理
社区“四点半课堂”解了家长难题
怎么注册教育咨询公司
Delphi RxRichEdit高级操作
delphi 怎么把image上的图片粘贴到剪切板上
delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法
Delphi 保存写字板程序, 并进行打印
Copyright © 2011-2022 走看看