///<summary>

        ///向服务器发送混合型的请求,1:成功发送,0:发送失败

        ///</summary>

        ///<param name="paranames">表单参数名数组</param>

        ///<param name="paravalues">参数值数组</param>

        ///<param name="files">文件名数组</param>

        ///<param name="errmsg">报错信息</param>

        ///<returns></returns>

        public int SendRequest(string[] paranames, string[] paravalues, string[] files, ref string errmsg)

        {
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.201"), 8085)); StringBuilder http, text; byte[] httpbyte; byte[] textbyte = null; long length = 0; DateTime now = DateTime.Now; List<byte[]> data = new List<byte[]>(); //构造时间戳 string strBoundary = "------------" + DateTime.Now.Ticks.ToString("x");
byte [] end = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "--\r\n");//结束标记
byte[] boundary = Encoding.ASCII.GetBytes("\r\n" + strBoundary + "\r\n"); //加载表单参数信息 if (paranames != null) { text = new StringBuilder(); for (int i = 0; i < paranames.Length; i++) { text.Append("--"); text.Append(strBoundary);//添加时间戳 text.Append("\r\n"); text.Append("Content-Disposition: form-data; name=\"" + paranames[i] + "\"\r\n\r\n"); text.Append(paravalues[i]); text.Append("\r\n"); } string para = text.ToString(); textbyte = Encoding.ASCII.GetBytes(para); length += textbyte.Length; } //加载文件信息 if (files != null) { for (int i = 0; i < files.Length; i++) { FileStream fs; StringBuilder sbfile = new StringBuilder(); try { fs = File.Open(files[i], FileMode.Open, FileAccess.Read, FileShare.Read); if (i == 0) sbfile.Append("--");//添加文件 else sbfile.Append("\r\n--"); sbfile.Append(strBoundary);//添加时间戳 sbfile.Append("\r\n"); sbfile.Append("Content-Disposition: form-data; name=\""); sbfile.Append("file"); sbfile.Append("\"; filename=\""); sbfile.Append("2222.png"); sbfile.Append("\""); sbfile.Append("\r\n"); sbfile.Append("Content-Type: "); sbfile.Append("application/octet-stream"); sbfile.Append("\r\nContent-Length:"); sbfile.Append(fs.Length.ToString()); sbfile.Append("\r\n"); sbfile.Append("\r\n"); string temp = sbfile.ToString(); byte[] bin = Encoding.UTF8.GetBytes(temp); data.Add(bin); length += bin.Length; length += fs.Length; fs.Close(); } catch (Exception exc) { errmsg = exc.Message.ToString(); return 0; } } } //构造http头 http = new StringBuilder(); http.Append("POST http://192.168.0.201:8085/api/file/upload HTTP/1.1\r\n"); http.Append("Content-Type:multipart/form-data;boundary="); http.Append(strBoundary); http.Append("\r\n"); http.Append("Host: 192.168.0.201:8085\r\n"); http.Append("Content-Length:"); http.Append((length+end.Length).ToString()); http.Append("\r\n"); http.Append("Expect: 100-continue\r\n");//注明要在收到服务器的continue消息后才继续上传http消息体 http.Append("Connection: Keep-Alive\r\n\r\n"); string strtemp = http.ToString(); httpbyte = Encoding.ASCII.GetBytes(strtemp); try { s.Send(httpbyte);// "//首先发送http头 Thread.Sleep(100); //string check = GetResponse(); //if (check == null || !check.Contains("Continue"))//得到服务器确认后才继续上传 //{ // errmsg = "客户端已成功发送请求,但服务器没有响应!"; // return 0; //} if (paranames != null) { s.Send(textbyte, textbyte.Length, SocketFlags.None);//发送表单参数 } if (files != null) {//依次发送文件 for (int i = 0; i < data.Count; i++) { int size = 0; FileStream fs = File.Open(files[i], FileMode.Open, FileAccess.Read, FileShare.Read); s.Send(data[i], data[i].Length, SocketFlags.None); byte[] buff = new byte[1024]; size = fs.Read(buff, 0, 1024); while (size > 0) { s.Send(buff, size, SocketFlags.None); size = fs.Read(buff, 0, 1024); } fs.Close(); } } s.Send(end, end.Length, SocketFlags.None);
return 1; } catch (Exception exc) { errmsg = exc.Message.ToString(); return 0; } }

C#  Socket Post 提交文件到服务器上 其中最重要的就是

上传文件的时候一定要主要提交结束标记

就是上文中的end

C# Socket Post File的更多相关文章

  1. MySQL5.7报错[ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock的解决方法

    发现MySQL服务器因系统磁盘写满导致服务停了,清理磁盘后启动服务时无法正常启动,查看localhost.err日志发现如下报错: [ERROR] Unix socket lock file is e ...

  2. flash as3 socket安全服务网关(socket policy file server)

    关键字: SecurityErrorEvent socket as3 flash有着自己的一套安全处理模式,在socket方面,我这样的菜鸟无法理解他的好处:一句话,不怀好意的人如果想用flash写一 ...

  3. socket (一)

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  4. Socket网络编程一

    1.Socket参数介绍 A network socket is an endpoint of a connection across a computer network. Today, most ...

  5. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  6. Python之路,Day8 - Python基础 面向对象高级进阶与socket基础

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  7. Python之路第一课Day8--随堂笔记(socket 承接上节---网络编程)

    本节内容 Socket介绍 Socket参数介绍 基本Socket实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 作业:开发一个支持多用户在线的FTP程 ...

  8. Android—基于Socket与上传图片到客户端

    最近项目中需要客户端和Socket互相传递数据时候需要相互传递图片所以做下总结以免以后忘记,也希望给大家带来帮助. 先上客户端的代码: 根据图片名称上传照相机中单个照片(此方法为自己封装) 参数所代表 ...

  9. 冰冻三尺非一日之寒-socket

    第八章 Socket语法及相关 SocketServer实现多并发 socket概念: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket又称&q ...

随机推荐

  1. [less]用webstorm自动编译less产出css和sourcemap

    css产出sourcemap有什么用呢,可能大家要问这个问题了. 请移步这里 https://developers.google.com/chrome-developer-tools/docs/css ...

  2. day17 Django学习三

    参考博客: http://www.cnblogs.com/wupeiqi/articles/5237704.html http://www.cnblogs.com/wupeiqi/articles/5 ...

  3. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...

  4. ubuntu16 tomcat7安装和编码修改

    有直接通过命令安装的,但是我还是喜欢把文件下载下来,然后自己配置. 1,下载tomcat7二进制文件 https://tomcat.apache.org/download-70.cgi 2,解压tom ...

  5. SDKMAN 软件开发工具包管理器

    SDKMAN 是用来在类Unix 系统中管理多个版本的开发环境的工具.提供命令行接口来安装.切换.删除.列出候选版本. SDKMAN!是在大多数基于Unix的系统上管理多个软件开发套件的并行版本的工具 ...

  6. Android程序员学WEB前端(2)-HTML(2)-锚点链接列表表单-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522417觉得博文有用,请点赞,请评论,请关注,谢谢!~锚点 链接 列表 表单 &l ...

  7. [Github] 本地git push免用户名和密码的配置

    在终端通过git config --global命令进行配置 git config --global user.email "xxx@xxmail.com" git config ...

  8. 如何从github下载项目的源代码,包含git客户端,直接下载,vs下载

    有好多小伙伴可能刚刚接触github,还不知道如果和github下载项目,此处写个博客统一的声明.从多种方式下载源代码,加深对git的理解. 首先先解释下git的含义,git是一个源代码的管理工具,通 ...

  9. css实现加载中的效果

    那天闲着,学习了一下样式效果,自己实现了一个简单的加载中的效果 废话不多说,开始吧!! 一.实现一个圆环       要实现圆环,首先我们需要知道盒模型里面border的本质,先来看一个效果吧 从上面 ...

  10. python基础(二)----数据类型

    Python基础第二章 二进制 字符编码 基本数据类型-数字 基本数据类型-字符串 基本数据类型-列表 基本数据类型-元组 可变.不可变数据类型和hash 基本数据类型-字典 基本数据类型-集合 二进 ...