作者godman362 (青)
看板NUU_CSIE
标题[笔记] C# Socket (3)
时间Sun May 31 20:07:08 2009
继续昨天未完的部份
TcpClient和
TcpListener
一个是用来当Client端,另一个则是拿来当Server端
用看得应该也看得出来哪一个应该对应哪一个
TcpClient用在Client端连结到Server端
用的也只有Connect连到远端
传资料的部份,却在TcpClient无法处理
必须由连结之後,将取得的Stream丢给
NetworkStream物件处理
以下,先来个小范例:
TcpClient Client =
new TcpClient();
这样是宣告出一个TcpClient的物件
而这样做,并没有建立任何连线,只有单纯宣告而已
在後面会做一个Connect的动作才是真正连结
如下:
Client.Connect(
IPAddress,
Port);
也就是连结到你想要连线的远端主机
其中,
TcpClient也有4种建构子,
没有一定要像我这样用
在Connect的Overload中,也有四种,
我现在上面所打不是我个人常用的风格
只是方便讲解而做的范例
接着要讲到
NetworkStream
他是一个用来做Stream的资料传输的datatype
那也就是将TcpClient所连线到的Server建立的Stream Assign给它
那就会变成下列的动作:
NetworkStream Streaming = Client.GetStream();
这样才算是完成的真正的连线作业
接着你想干吗就干吗,要收资料或是送资料都可以藉此Stream进行
那用法如下:
Streaming.Read()
Streaming.Write()
Overload内容就留给各位自己参阅了,我就不作多述
但是不知道你有没有发现,这边跟前面提到的
Socket Client有没有不同
之前Socket的Client端是不能接收资料的,也就是
不能Read(Recevice)
在
TcpClient却是可以的,所以这也是它方便的地方
接着来谈
TcpListener
它是用来当Socket的Server端
用法也跟Socket差不多,但较为简单
来个范例会较为清楚:
TcpListener ServerSocket =
new TcpListener(
All_IPAddress,
Open_Port);
这样就算完成了Server端的设定
以上资讯说明你愿意接收来自所有IP的Client端,并且用Open_Port来接收
接着只要启动它就可以了,启动方式如下:
ServerSocket.Start();
这样一个动作中,完成了Socket中的
Bind和
Listen两个动作
但是,
它并没有省略掉Accept的动作,这点要特别注意
所以,还是要来处理Accept的问题
在前面的TcpClient提到读写资料,是利用
NetworkStream来沟通
想当然尔,这边一样不例外
在TcpListener也是要用NetworkStream来传输资料
如下:
NetworkStream Streaming = ServerSocket.AcceptTcpClient();
接着使用的方法就跟上面一样了,所以不再多提
当然,再ServerSocket中还有一个AcceptSocket的方法
当然也是可以用,只是不建议
因为为了维持程式的一致性,最好一路贯彻到底
不要一下用Socket一下又用TcpClient、TcpListener
这样会让程式码看来混乱无序
以上,Socket到此告一个段落(应该?)
有缘再见,拜拜。
--
要
感谢的人太多了,那就
谢天吧
要
改得程式码太多了,那就
改天吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.118.50.15
1F:推 sct830:照样推你~XD 真是详细... 06/01 21:10
2F:→ godman362:喔忘了附带一提 06/02 17:07
3F:→ godman362:以上讲的这些作法都使以Blocking I/O做的 06/02 17:07
4F:→ godman362:这是初学,也是最简单的作法 06/02 17:07
5F:→ godman362:Non-Blocking I/O的部份,就是Async的部份 06/02 17:08
6F:→ godman362:那个部份我还在研读中,有机会在讨论 06/02 17:08