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;
}
}
}
查看全文
相关阅读:
Java中的位运算符、移位运算符
数据结构——树
Java Collections工具类
Map集合
博客园插入bilibili视频
TreeSet练习 根据字符串长度排序
Java Set集合
规划极限编程读后感(3)
规划极限编程读后感(2)
规划极限编程读后感(1)
原文地址:https://www.cnblogs.com/zyip/p/1450590.html
最新文章
类加载顺序(2)
类加载顺序(1)
单例模式
设计模式
占位 Java程序部署
throw throws区别
Java中类的关系
assert断言
05-大白话说cookie和session通信到底是怎么一回事
05-虚拟DOM/Diff算法中可以看到循环中加key的重要性(性能)
热门文章
13-DOM二级事件与DMO0级事件-DOM三级事件
03-Object.freeze()优化vue想目,数据列表的优化
02-Object.freeze()冻结
01-多维数组变为一维数组
04-interator和for of循环和forEach遍历数组对比
03-vue动态引入组件的四种方式
02-ES6-Object.is(a,b) / Set数据结构 / Array.from()将Set结构或类数组转为数组/ES6处理内存泄漏
画图软件推荐
Java8 HashMap之tableSizeFor
计算机为什么使用补码做加法
Copyright © 2011-2022 走看看