打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# TcpListener和TcpClient的应用

C# TcpListener和TcpClient的应用

(2013-01-14 10:33:06)
标签:

杂谈

//服务器端程序
using System.IO;
using System.Net.Sockets;
using System.Net;
namespace PictureServer
{
    class Program
    {
       static void Main(string[] args)
       {
//在本机创建一个TcpListener,端口是8888,
          TcpListener listener = new TcpListener(IPAddress.Any, 8888);
//开始监听,
          listener.Start();
//循环,等待客户端连接
           while(true)
           {

              const int bufferSize =256;
//接受客户端的连接,利用client保存连接的客户端
              TcpClient client =listener.AcceptTcpClient();
//获取客户端的流stream
              NetworkStream clientStream =client.GetStream();
              byte[] buffer = newbyte[bufferSize];
              int readBytes = 0;
//将客户端流读入到buffer中
              readBytes =clientStream.Read(buffer, 0, bufferSize);
//将从客户端流读取的数据保存到字符串request中
              string request =Encoding.ASCII.GetString(buffer).Substring(0, readBytes);
//如果客户端的命令以LIST开头,
              if(request.StartsWith("LIST"))
              {
                 // LIST request - return list
//利用类PictureHelper的函数GetFileListBytes,获取图片文件列表
                 byte[] responseBuffer =PictureHelper.GetFileListBytes();
//将服务器获取的图片文件列表写入到clientStream中
                 clientStream.Write(responseBuffer, 0,responseBuffer.Length);
              }
//如果客户端的请求命令以FILE开头,即获取单个图片文件
              else if(request.StartsWith("FILE"))
              {
              // FILE request - returnfile
                 // get the filename
//获取请求的文件名字
                 string[] requestMessage =request.Split(':');
                 string filename = requestMessage[1];
//利用File.ReadAllBytes函数将文件里面的文件filename读入到字节数组data中,             
    byte[] data =File.ReadAllBytes(Path.Combine(@"C:Documents andSettingsAdministratorMy DocumentsMy Pictures", filename));
                 // Send the picture to the client.
//将data中的文件内容写入到客户端clientStream中,传回客户端
                 clientStream.Write(data, 0, data.Length);
              }
//关闭客户端流
              clientStream.Close();
           }
       }
//静态类PictureHelper,
       public static class PictureHelper
       {
//提供文件夹中的文件列表
           publicstatic string[] GetFileList()
           {
              string[] files =Directory.GetFiles(@"C:Documents and SettingsAdministratorMyDocumentsMy Pictures");
//去掉文件夹路径,只保留文件名
              // Remove the directory pathfrom the filename.
              for (int i = 0; i <files.Length; i++)
              {
                 files[i] = Path.GetFileName(files[i]);
              }
              return files;
           }
//将文件filename的内容读到字节数组中
           publicstatic byte[] GetPictureBytes(string filename)
           {
              FileInfo fileInfo = newFileInfo(filename);
              byte[] buffer = newbyte[fileInfo.Length];
              using (FileStream stream =fileInfo.OpenRead())
              {
                 stream.Read(buffer, 0, buffer.Length);
              }
              return buffer;
           }

           publicstatic byte[] GetFileListBytes()
           {
              // LIST request - returnlist
              string[] files =PictureHelper.GetFileList();
              StringBuilder responseMessage= new StringBuilder();
              foreach (string s infiles)
              {
                 responseMessage.Append(s);
                 responseMessage.Append(":");
              }
              byte[] responseBuffer =Encoding.ASCII.GetBytes(
             responseMessage.ToString());
              return responseBuffer;
           }
       }
    }
}
 
//////客户端程序
using System.Net;
using System.Net.Sockets;
using System.IO;
 
       private void buttonListPictures_Click(objectsender, EventArgs e)
       {
           const intbufferSize = 4096;
           // Connectto the server.
//生成一个TcpClinet
           TcpClientclient = new TcpClient();
//生成服务器的IPHostEntry,因为我的服务器和客户端在同一台计算机上,所以此处用localhost,实际应用中,此处的localhost应用用服务器的ip地址代替,
          IPHostEntry host = Dns.GetHostEntry("localhost");
// 连接到服务器的8888端口
 client.Connect(host.AddressList[0],8888);
           // Send arequest to the server.
//创建一个NetworkStream,  
        NetworkStream clientStream =client.GetStream();
//request是"LIST"         
          stringrequest = "LIST";
//将request放入到字节数组requestBuffer中
           byte[]requestBuffer = Encoding.ASCII.GetBytes(request);
//将请求写入到NetworkStream中,发送到服务器端
          clientStream.Write(requestBuffer, 0, requestBuffer.Length);
//获取服务器端的回应
           // Readthe response from the server.
           byte[]responseBuffer = new byte[bufferSize];
//生成一个内存流memstream
          MemoryStream memStream = new MemoryStream();
           intbytesRead = 0;
           do
           {
//将网络流中的数据按256字节一组的顺序写入到memStream中
           bytesRead= clientStream.Read(responseBuffer, 0, bufferSize);
          memStream.Write(responseBuffer, 0, bytesRead);
           } while(bytesRead > 0);
          clientStream.Close();
          client.Close();
//从内存流读取数据
           byte[]buffer = memStream.GetBuffer();
           stringresponse = Encoding.ASCII.GetString(buffer);
//将服务器返回的文件列表分解开,文件名保存到字符串数组fileName中         
           string[]fileNames = response.Split(':');
//将字符串数组填到ListBox中
          this.listFiles.DataSource = fileNames;
       }
 
//获取单个图片文件,并显示之    
       private void buttonGetPicture_Click(objectsender, EventArgs e)
       {
           const intbufferSize = 4096;
           TcpClientclient = new TcpClient();
          IPHostEntry host = Dns.GetHostEntry("localhost");
          client.Connect(host.AddressList[0],8888);
          NetworkStream clientStream = client.GetStream();
           try
           {
//生成请求,以FIlE:开头,后接在listbox中选择的文件名
              string request = "FILE:" +this.listFiles.SelectedItem.ToString();
              byte[] requestBuffer =Encoding.ASCII.GetBytes(request);
//将请求写入到clientStream中,发送到服务器端
             clientStream.Write(requestBuffer, 0, requestBuffer.Length);
              byte[] responseBuffer = newbyte[bufferSize];
         
          MemoryStream memStream = new MemoryStream();
           intbytesRead = 0;
           do
           {
//获取服务器端的回应,
              bytesRead =clientStream.Read(responseBuffer, 0, bufferSize);
//服务器的回应写入到memStream
             memStream.Write(responseBuffer, 0, bytesRead);
           } while(bytesRead > 0);
          clientStream.Close();
          client.Close();
 //从内存流中读取图片文件数据,显示在picturebox控件上    
          pictureBox.Image = Image.FromStream(memStream);
       }
       catch (Exception exce)
       {
          MessageBox.Show(exce.Message);
       }
       }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C# TcpClient网络编程传输文件(带文件名)
C# 实现基本的套接字TCP通信
[C# 网络编程系列]自定义Web服务器
C# TCP通讯示例
C# Tutorial
C#线程系列讲座(3):线程池和文件下载服务器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服