(4)接收客户端发送过来的数据(用缓存来接收)
byte[] buffer = new byte[BufferSize]; // BufferSize为缓存的大小
int bytesRead;
try
{
lock (streamToClient)//为了保证数据的完整性以及安全性 锁定数据流
{
bytesRead = streamToClient.Read(buffer, 0, BufferSize);
}
(5)向连接的客户端发送数据
lock (streamToClient)
{
streamToClient.Write(buffer, 0, buffer.Length);//buffer为发送的字符数组
}
(6)释放数据流和TcpClient(以便下次的数据以及客户端的收发)
streamToClient.Dispose();//释放数据流中的数据
remoteClient.Close();//释放TcpClient实例
客户端
(1) 连接服务器
TcpClient tcp = new TcpClient();
tcp.Connect(IP,Port);//根据服务器的IP地址和侦听的端口连接
if (tcp.Connected)
{
//连接成功的消息机制 详细见DEMO
ShowGetData("成功连接上了服务器:", this.strIP.Text.ToString());
}
这里需要注意的是,不管是使用有参数的构造函数与服务器连接,或者是通过Connect()方法与服务器建立连接,都是同步方法(或者说是阻塞的,英文叫block)。它的意思是说,客户端在与服务端连接成功、从而方法返回,或者是服务端不存、从而抛出异常之前,是无法继续进行后继操作的。这里还有一个名为BeginConnect()的方法,用于实施异步的连接,这样程序不会被阻塞,可以立即执行后面的操作,这是因为可能由于网络拥塞等问题,连接需要较长时间才能完成。网络编程中有非常多的异步操作,凡事都是由简入难,关于异步操作,我们后面再讨论,现在只看同步操作。
(2) 建立连接服务端的数据流
NetworkStream streamToServer = tcp.GetStream();
(3) 接收和发送数据
//发送字符串
byte[] buffer = Encoding.Unicode.GetBytes(msg); //msg为发送的字符串
try
{
lock (streamToServer)
{
streamToServer.Write(buffer, 0, buffer.Length); // 发往服务器
}
//接收字符串
buffer = new byte[BufferSize];
lock (streamToServer)
{
bytesRead = streamToServer.Read(buffer, 0, BufferSize);
}
}
1.2. 异步
相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:
服务器:










