C# Socket传输图片

不管是socket还是udp发送图片都是把图片转换成字节流,收到字节流的电脑把字节流写入磁盘便生成了新的图片。

首先是把图片转换成字节流的方法:

        public static byte[] GetPictureBytes(string filename)       //filename填写图片路径
        {
            FileInfo fileInfo = new FileInfo(filename);
            byte[] buffer = new byte[fileInfo.Length];
            using (FileStream stream = fileInfo.OpenRead())
            {
                stream.Read(buffer, 0, buffer.Length);
            }
            return buffer;
        }

发送端:

地址:          IPEndPoint  iep = new IPEndPoint(IPAddress.Parse(strIp), int.Parse(strPort));

            bytes = GetPictureBytes(@strP);	//图片路径,转成字节流
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化Socket对象
            client.Connect(iep);//与该ip地址进行连接
            byte[] datasize = new byte[4];
            datasize = BitConverter.GetBytes(bytes.Length);    //把长度作为16进制数放在datasize中
            client.Send(datasize);      //发送字节流长度给服务器
            client.Send(bytes, bytes.Length, SocketFlags.None);  //发送图片字节

服务器端:

                FileStream wrtr; //文件读写类
                server.Listen(10); //监听
                Socket s = server.Accept(); //当有客户端与服务器进行连接,Accept方法返回socket对象,通过该对象可以获取客户端发送的消息
                byte[] data = new byte[4];
                int rect = s.Receive(data, 0, 4, 0); //用来接收图片字节流长度
                int size = BitConverter.ToInt32(data, 0);  //16进制转成int型
                int dataleft = size; 
                data = new byte[size];  //创建byte组

                wrtr = new FileStream(strPath + "\\"new.png", FileMode.Create);  //创建新文件"new.jpg",strPath是路径
  
                int total = 0;
                while (total < size)   //当接收长度小于总长度时继续执行
                {
                    rect = s.Receive(data, total, dataleft, 0);    //接收字节流,receive方法返回int获取已接收字节个数,第一个参数是需要写入的字节组,第二个参数是起始位置,第三个参数是接收字节的长度
                    total += rect;            //已接收个数-下一次从当前个数开始接收
                    dataleft -= rect;  //剩下的字节长度
                }
                wrtr.Write(data, 0, data.Length); //输出文件
                wrtr.Flush();  //强制输出
                wrtr.Close();  //关闭文件流对象

你可能感兴趣的:(C#)