C# Socket 简易的图片传输

  关于网络的数据传输我就是个小白,所以今天学习一下简易的Socket图片传输。

客户端和服务器的连接咱们上次已经学过了,咱们先从简易的文件传输入手。下面开始代码分析了。

Server.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            lab_pro.Text = "接收:0/100";
        }
        /// <summary>
        /// 开启服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Text = "监听中...";
            button1.Enabled = false;
            Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint hostIpEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 121);

            //设置接收数据缓冲区的大小
            byte[] b = new byte[4096];
            receiveSocket.Bind(hostIpEndPoint);
            //监听
            receiveSocket.Listen(2);
            //接受客户端连接
            Socket hostSocket = receiveSocket.Accept();
            //如何确定该数组大小
            MemoryStream fs = new MemoryStream();

            int length = 0;
            //每次只能读取小于等于缓冲区的大小
            while ((length = hostSocket.Receive(b)) > 0)
            {
                fs.Write(b, 0, length);

                if (progressBar1.Value <100)
                {
                    progressBar1.Value++;
                    lab_pro.Text = "接收:" + progressBar1.Value + "/100";
                }

            }
            progressBar1.Value = 100;
            lab_pro.Text = "接收:" + progressBar1.Value + "/100";
            fs.Flush();
            Bitmap Img = new Bitmap(fs);
            Img.Save(@"reveive.jpg", ImageFormat.Png);

            //关闭写文件流
            fs.Close();
            //关闭接收数据的Socket
            hostSocket.Shutdown(SocketShutdown.Receive);
            hostSocket.Close();
            //关闭发送连接
            receiveSocket.Close();

        }
    }
}

客户端Client.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        static Socket sendsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        Byte[] imgByte = new byte[1024];

        /// <summary>
        /// 打开本地文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btm_scane_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.Filter  = "Image Files(*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG" +"|All Files (*.*)|*.*";
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    string path = this.openFileDialog1.FileName;
                    lab_path.Text = path;
                    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                    imgByte = new Byte[fs.Length];
                    fs.Read(imgByte, 0, imgByte.Length);
                    fs.Close();
                }
                catch (Exception)
                {
                }
            }
        }
       /// <summary>
       /// 向服务器发送数据
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
        private void btn_send_Click(object sender, EventArgs e)
        {

            //实例化socket
            IPEndPoint ipendpiont = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 121);
            sendsocket.Connect(ipendpiont);
            MessageBox.Show("服务器IP:"+sendsocket.RemoteEndPoint);
            sendsocket.Send(imgByte);
            sendsocket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
            sendsocket.Close();
            sendsocket.Dispose();
        }
    }
}

运行结果:

开启服务:

发送图片:

局域网测试传输图片通过,希望对大家学习有帮助,如有错误可以联系我哦。

时间: 2024-07-31 02:55:21

C# Socket 简易的图片传输的相关文章

C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)

在程序设计中,涉及数据存储和数据交换的时候,不管是B/S还是C/S模式,都有这样一个概念:数据库服务器.这要求一台性能和配置都比较好的主机作为服务器,以满足数目众多的客户端进行频繁访问.但是对于一些数据交换的要求不主同,而且涉及到的通讯个体数目不多,如果还采用“一主机多客户机”的模式,便要求一台硬件配置良好而且软件上安装了相关数据服务软件,这样会造成硬件和软件上的很多不必要的成本,这时Socket在点对点的平行对象之间的网络通讯的优势就就发挥出来了. 其实对于Socket通讯来说,服务器和客户端

使用Net.Sockets.TcpListener和Net.Sockets.TcpClient进行图片传输时如何精确控制接收缓存数组大小

<span style="font-size:18px;">在dotnet平台Net.Sockets.TcpListener和Net.Sockets.TcpClient已经为我们封装了所有Socket关于tcp部分,操作也更为简单,面向数据流.使用TcpClient的GetStream方法获取数据流后可以方便的对数据流进行读写操作,就如同本地磁盘的文件读写一样,使得程序员在设计程序时更为便捷简单.</span> 但如果你使用过这两个对象进行数据传输的时候,你会发

WCF开山篇__图片传输

WCF开山篇__图片传输 一.  简介 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序接口,可以翻译为Windows通讯接口,它是.NET框架的一部分,由 .NET Framework 3.0 开始引入,与 Windows Presentation Foundation及 Windows Workflow Foundation并行为新一代 Windows 操作系统以及 WinFX 的三个重大应用程序开发类库.WCF由于集合了几乎由.

[JAVA]Socket 图片流的传输

import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { System.out.

通过Socket连接一次传输多个文件

最近在做一个通过WIFI在手机之间传输文件的功能.需要在手机之间建立一个持久的Socket 连接并利用该连接传输数据.可以一次传输一个或多个文件. 在一次传输多个文件时,遇到了一个困难:如何在接收文件时确定文件之间的边界. 为了在接收端正确的拆分文件,在传输文件时需要传输每个文件的大小. 我采用了这样一种策略:首先发送每个文件的名称和大小,然后传输文件的内容. protected void sendFile(Socket socket, File[] files) { long totalSiz

用tensorflow神经网络实现一个简易的图片分类器

文章写的不清晰请大家原谅QAQ 这篇文章我们将用 CIFAR-10数据集做一个很简易的图片分类器. 在 CIFAR-10数据集包含了60,000张图片.在此数据集中,有10个不同的类别,每个类别中有6,000个图像.每幅图像的大小为32 x 32像素.虽然这么小的尺寸通常给人类识别正确的类别带来了困难,但它实际上是对计算机模型的简化并且减少了分析图像所需的计算.                                                                CIFA

用scala实现一个基于TCP Socket的快速文件传输程序

这是用scala实现的一个简单的文件传输程序. 服务端 package jpush import java.io.{DataInputStream, File, FileOutputStream} import java.net.ServerSocket import scala.collection.JavaConversions._ /** * Created by dingb on 2016/6/3. */ object Server extends App { def port = 88

使用Net.Sockets.TcpListener和Net.Sockets.TcpClient进行图片传输时怎样精确控制接收缓存数组大小

<span style="font-size:18px;">在dotnet平台Net.Sockets.TcpListener和Net.Sockets.TcpClient已经为我们封装了全部Socket关于tcp部分,操作也更为简单,面向数据流.使用TcpClient的GetStream方法获取数据流后能够方便的对数据流进行读写操作,就如同本地磁盘的文件读写一样,使得程序猿在设计程序时更为便捷简单.</span> 但假设你使用过这两个对象进行传输数据的时候,你会发

基于socket简易版客户端,服务端交互

简易版客户端服务端交互 常识 AF_UNIX 是基于文件类型的套接字家族 AF_INET是 基础网络类型的套接字家族 socket 模块属性很多,可以直接使用from module import *语句 ,这样socket所有的数据都被带劲命名空间里了. 减少代码量(少用) 服务端 #1导入 import socket # 2.获取套接字 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #3绑定 s.bind(('127.0.0.1',807