【C#食谱】【杭帮菜】菜单2:写一个TCP客户端

问题:
你想连接基于TCP的服务端。
解决方法:
使用System.Net.TcpClient类,通过给服务端传递地址和端口来和服务端建立连接和会话。下面这个例子将和上一菜单中的服务端进行会话。
class MyTcpClient
{
    
private TcpClient _client = null;
    
private IPAddress _address;
    
private int _port;
    
private IPEndPoint _endPoint = null;

    
public MyTcpClient(IPAddress address, int port)
    
{
        _address 
= address;
        _port 
= port;
        _endPoint 
= new IPEndPoint(_address, _port);
    }



    
public void ConnectToServer(string msg)
    
{
        
try
        
{
            _client 
= new TcpClient();
            _client.Connect(_endPoint);

            
// 获取将要发生的消息
            byte[] bytes = Encoding.ASCII.GetBytes(msg);
            
// 获取和服务端会话的流
            using (NetworkStream ns = _client.GetStream())
            
{
                
// 发送消息
                Trace.WriteLine("Sending message to server: " + msg);
                ns.Write(bytes, 
0, bytes.Length);
                
// 获得响应
                
// 存储响应内容的缓存
                bytes = new byte[1024];

                
// 显示响应内容
                int bytesRead = ns.Read(bytes, 0, bytes.Length);
                
string serverResponse = Encoding.ASCII.GetString(bytes, 0, bytesRead);
                Trace.WriteLine(
"Server said: " + serverResponse);
            }

        }

        
catch (SocketException se)
        
{
            Trace.WriteLine(
"There was an error talking to the server: " +
                se.ToString());
        }

        
finally
        
{
            
// 关闭所有的东西
            if(_client != null
                _client.Close();
        }

    }

}
要使用这个类,你可以简单的创建一个它的实例,然后通过调用ConnectToServer来发送请求。在这个程序中,你首先呼叫了服务端三次,来测试基本的机制。接着,你进入一个循环来真正的“重击”服务端,使得请求数超过服务端默认的线程池容量。这就可以证明服务端在处理多个请求的机制是可靠的。
    static void Main(string[] args)
    
{

        MakeClientCallToServer(
"Just wanted to say hi");
        MakeClientCallToServer(
"Just wanted to say hi again");
        MakeClientCallToServer(
"Are you ignoring me?");

        
// 现在发送一堆消息
        string msg;
        
for (int i = 0; i < 100; i++)
        
{
            msg 
= string.Format("I'll not be ignored! (round {0})", i); 
            ThreadPool.QueueUserWorkItem(
new WaitCallback(MakeClientCallToServer), msg);
        }


        Console.WriteLine(
"\n Press any key to continue… (if you can find it…)");
        Console.Read(); 
    }


    
static void MakeClientCallToServer(object objMsg)
    
{
        
string msg = (string)objMsg;
        MyTcpClient client 
= new MyTcpClient(IPAddress.Loopback,55555);
        client.ConnectToServer(msg);
    }
在客户端的输出是这样的:
Sending message to server: Just wanted to say hi
Server said: Thanks call again
!
Sending message to server: Just wanted to say hi again
Server said: Thanks call again
!
Sending message to server: Are you ignoring me
?
Server said: Thanks call again
!
Sending message to server: I
'll not be ignored! (round 0)
Sending message to server: I'll not be ignored! (round 1)
Sending message to server: I'll not be ignored! (round 2)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 3)
Sending message to server: I'll not be ignored! (round 4)
Sending message to server: I'll not be ignored! (round 5)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 6)
Sending message to server: I'll not be ignored! (round 7)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 8)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 9)
Sending message to server: I'll not be ignored! (round 10)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 11)
Sending message to server: I'll not be ignored! (round 12)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 13)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 14)
Sending message to server: I'll not be ignored! (round 15)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 16)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 17)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 18)
Sending message to server: I'll not be ignored! (round 19)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 20)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 21)
Sending message to server: I'll not be ignored! (round 22)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 23)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 24)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 25)
Sending message to server: I'll not be ignored! (round 26)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 27)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 28)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 29)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 30)
Sending message to server: I'll not be ignored! (round 31)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 32)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 33)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 34)
Sending message to server: I'll not be ignored! (round 35)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 36)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 37)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 38)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 39)
Sending message to server: I'll not be ignored! (round 40)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 41)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 42)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 43)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 44)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 45)
Sending message to server: I'll not be ignored! (round 46)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 47)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 48)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 49)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 50)
Sending message to server: I'll not be ignored! (round 51)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 52)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 53)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 54)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 55)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 56)
Sending message to server: I'll not be ignored! (round 57)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 58)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 59)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 60)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 61)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 62)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 63)
Sending message to server: I'll not be ignored! (round 64)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 65)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 66)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 67)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 68)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 69)
Sending message to server: I'll not be ignored! (round 70)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 71)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 72)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 73)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 74)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 75)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 76)
Sending message to server: I'll not be ignored! (round 77)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 78)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 79)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 80)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 81)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 82)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 83)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 84)
Sending message to server: I'll not be ignored! (round 85)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 86)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 87)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 88)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 89)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 90)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 91)
Sending message to server: I'll not be ignored! (round 92)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 93)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 94)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 95)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 96)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 97)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 98)
Server said: Thanks call again!
Sending message to server: I
'll not be ignored! (round 99)
Server said: Thanks call again!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
Server said: Thanks call again
!
线程 
0xb10 已退出,返回值为 0 (0x0)。
线程 
'<无名称>' (0x344) 已退出,返回值为 0 (0x0)。
线程 
0xe90 已退出,返回值为 0 (0x0)。
线程 
'<无名称>' (0xb64) 已退出,返回值为 0 (0x0)。
线程 
0x73c 已退出,返回值为 0 (0x0)。
线程 
0xd9c 已退出,返回值为 0 (0x0)。
线程 
'<无名称>' (0xdf8) 已退出,返回值为 0 (0x0)。
线程 
0xe8c 已退出,返回值为 0 (0x0)。
线程 
0x204 已退出,返回值为 0 (0x0)。
线程 
0xc54 已退出,返回值为 0 (0x0)。
线程 
0xad0 已退出,返回值为 0 (0x0)。
线程 
'<无名称>' (0xd34) 已退出,返回值为 0 (0x0)。
线程 
0xce8 已退出,返回值为 0 (0x0)。
线程 
0xe88 已退出,返回值为 0 (0x0)。
线程 
0xb6c 已退出,返回值为 0 (0x0)。
线程 
0xaa8 已退出,返回值为 0 (0x0)。
线程 
0xf4 已退出,返回值为 0 (0x0)。
线程 
0xae4 已退出,返回值为 0 (0x0)。
线程 
0x6f8 已退出,返回值为 0 (0x0)。
线程 
'<无名称>' (0x6c4) 已退出,返回值为 0 (0x0)。
线程 
0xcfc 已退出,返回值为 0 (0x0)。
线程 
0x504 已退出,返回值为 0 (0x0)。
讨论:
MyTcpClient.ConnectToServer是被设计用来发送一条消息,获得响应,显示响应的内容,然后关闭连接。为了完成这些,它创建一个System.Net.TcpClient并通过调用TcpClient.Connect连接到服务端。Connect通过IPEndPoint定位到服务端,IPEndPoint是根据你传递给MyTcpClient的构造函数的参数(IP地址和端口)确定的。
MyTcpClient.ConnectToServer然后用Encoding.ASCII.GetBytes从string中取得bytes。一旦有bytes要发送,它通过调用System.Net.TcpClient的GetStream方法来获取NetworkStream,然后通过TcpClient.Write方法来发送消息。
为了中服务端收到响应,阻塞函数TcpClient.Read被调用。然后连接被关闭,客户端结束。
写一个TCP服务端
posted @ 2008-05-11 10:44  随风逝去(叶进)  阅读(3573)  评论(4编辑  收藏  举报
Free Web Counter
Free Web Counter