您的位置:首页 > 编程语言 > C#

关于C#里面socket编程的一点理解

2011-03-07 12:10 381 查看
这几天倒腾socket编程,在博客园找到了张子阳大哥的socket编程的系列文章 看了很不错 。

网上也有许多类似的文章,我这里也纯属炒剩饭 。献丑了哈

首先还是用tcpListener 跟tcpClient吧 先把基础的搞懂了再说

socket编程的概念用我们以前老师的话说就是一个类似打电话 或者管子 的概念。

为什么是打电话捏,如果要建立连接( 打电话) 另外一端不会知道你什么时候会打给他 可能马上也可能过很久,就是说始终有一方要一直守在那里 等待接入 这就是tcpListener

也就是服务端总是要使用tcplistener。

下面看一下建立最基本的建立tcpListener:

static void Main(string[] args)
{
//在本机的6500端口上建立侦听
TcpListener listener = new TcpListener(6500);
listener.Start();

ConsoleKey key;
Console.WriteLine("请按Q键退出!!");
do
{
key = Console.ReadKey().Key;
} while (key != ConsoleKey.Q);
}


程序运行后 在命令行使用 netstat -a 可看到如下信息:



别忘了加上张子阳大哥的那几句“请按Q键退出”的代码 ,要不然闪一下就过了看不到任何效果。

下面我们来一个客户端连服务器 然后从服务端接收一个字符串的例子:

服务端:

static void Main(string[] args)
{
//在本机的6500端口上建立侦听
TcpListener listener = new TcpListener(6500);
//启动侦听
listener.Start();

Console.WriteLine("server is running...");
while (true)
{
//处理新的接入
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
string str = "MrXiang";
stream.Write(Encoding.ASCII.GetBytes(str), 0, str.Length);
}
}


客户端:

static void Main(string[] args)
{
//远程主机ip+端口
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
IPEndPoint port = new IPEndPoint(ip, 6500);

TcpClient client = new TcpClient();
//建立连接
client.Connect(port);

//System.Threading.Thread.Sleep(1000);

NetworkStream stream = client.GetStream();
byte[] data = new byte[client.Available];

stream.Read(data, 0, data.Length);

Console.WriteLine(Encoding.ASCII.GetString(data));

ConsoleKey key;
Console.WriteLine("请按Q键退出!!");
do
{
key = Console.ReadKey().Key;
} while (key != ConsoleKey.Q);
}


怎么样简单吧,先运行服务端 然后运行客户端

但是在客户端你会发现有时候你收不到字符串 (要看运气了)有时后又收得到:





你调用 client.Available 属性发现每次都是0 也就是说没有任何数据可供读取。

然后把那句 //System.Threading.Thread.Sleep(1000); 注释去掉 。保证每次都会收到字符串

这是为什么捏 ,且听贫僧娓娓道来:

本来两端有各自的tcpClient对象 他们之间是没有任何瓜葛的(这不废话吗 两台电脑上) 你读你的数据 我写我的数据,并且读还不一定就读得到数据 因为他们之间
根本就是不同步的 你不能要求别人什么时候在另一端把数据写入,就算另一端在指定时间把数据写入了 网络问题 延迟啥的
各种问题纷繁复杂 都不能保证你在什么时间一定会收到数据(这就是上面为什么要使用sleep 来等待服务端务必把数据发送完整了才进行读取)
我们能做的只能是建立一个连接(那个啥子3次握手 啥的 俺也不懂) 然后一直在那个连接上收发二进制数据 实在等得受不鸟了就 咔嚓, 仅此而已 这就是socket
我们往socket这个封装好的“邮筒”里投邮件 收邮件,至于邮件能不能送到 什么时候送到 这些我们都不能控制

但是他们两端用的tcpClient 却又有某种关联 好像就是一个一样,就好像一根“管子”把两个tcpClient连接起来了 一边读另一边就写
而他们之间来来往往的是二进制数据 嗯“管子”一个形象的比喻
执行一次连接就会有“一对”端口出现 因为一个服务端 一个客户端





但是这些“管子”通通是建立在tcpListener之上的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: