最近在整网络编程的部分,以前从没有接触过,现在把学习过程中的一些体会写下来,这篇Blog是用Windows Live Writer写的,用的Google输入法,呵呵,测试下。

        在进行网络编程的时候,不可避免的要碰上多线程的问题。首先建立一个简单的服务器端,在一个单独的进程中进行监听本机的某一固定端口,先要声明一个IPEndPoint类的实例,构造函数为IP地址和端口号:

string hostname = Dns.GetHostName();
IPAddress[] address = Dns.GetHostAddresses(hostname);
IPEndPoint ipentry = new IPEndPoint(address[0], 1234);
txt_IpEntry.Text = ipentry.ToString();
listen = new TcpListener(ipentry);

listen.Start();下面是MSDN对TcpListener类的说明:

TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClient 或 Socket 来连接 TcpListener。可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。

Start 方法用来开始侦听传入的连接请求。Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。可使用 AcceptSocket 或 AcceptTcpClient 从传入连接请求队列提取连接。这两种方法将阻止。如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。

然后就可以开启一个新线程进行阻塞式监听了:socket = listen.AcceptSocket();MSDN对AcceptSocket的说明:

AcceptSocket 是一个阻止方法,该方法返回可用于发送和接收数据的 Socket。如果希望避免阻止,请使用 Pending 方法来确定传入连接队列中的连接请求是否可用。

返回的 Socket 是使用远程主机的 IP 地址和端口号初始化的。您可以使用 Socket 类中任何可用的 Send 和 Receive 方法与远程主机进行通信。使用 Socket 后,请确保调用其 Close 方法。如果应用程序相对简单,请考虑使用 AcceptTcpClient 方法代替 AcceptSocket 方法。TcpClient 提供了一些通过网络在阻止同步模式下发送和接收数据的简单方法。

       当程序运行到这一步后,如果此时没有客户端请求,则当前线程进入阻塞状态,停在此处,直到客户端要进行发送连接请求时,AcceptSocket()方法返回套接字,然后执行下面的程序。

      根据自己反复实验跟踪,明白了一些东西,例如下面这段程序:

while (true)
{
socket = listen.AcceptSocket();
}

这个循环一开始以为每时每刻都在执行,后来经过单步调试得知,点击开始监听按钮时,此线程开启,然后执行到上面的语句后进入阻塞状态,一直等到客户端有连接请求,则得到套接字,程序继续向下执行,一旦建立连接后,客户端就可以与服务器端通信了,这时监听线程又停在了上面的那句程序那,进入阻塞状态,直到有新的客户端发送连接请求。

posted on 2007-04-12 10:48  Tiu  阅读(789)  评论(0编辑  收藏  举报