C# Socket传输图片

来源:互联网 发布:汉服淘宝店平价学生党 编辑:程序博客网 时间:2024/05/16 07:03

不管是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();  //关闭文件流对象

0 0
原创粉丝点击