///<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. python进行linux系统监控

      python进行linux系统监控 Linux系统下: 静态指标信息: 名称 描述 单位 所在文件 mem_total 内存总容量 KB /proc/meminfo disks 磁盘相关信息 - ...

  2. python 细节回顾

    #!/usr/bin/python # -*- coding: UTF-8 -*- for letter in 'Python': # 第一个实例 if letter == 'h': continue ...

  3. poj 2739 Sum of Consecutive Prime Numbers 素数 读题 难度:0

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19697 ...

  4. hdu 4081 Qin Shi Huang's National Road System 树的基本性质 or 次小生成树思想 难度:1

    During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in Ch ...

  5. C# 调用颜色的RGB值_RGB颜色转换十六进制颜色

    调用方法: 如:btn_FangTai.BackColor = Color.FromArgb(135, 206, 250); 十六进制颜色查询 颜   色 英文代码 形象描述 十六进制 RGB   L ...

  6. 微信小程序单个倒计时效果

    var end_time = grouponList.expire_time.replace(/-/g, '/') grouponcountdown(that, end_time) //适用于商品列表 ...

  7. CentOS7 开通特定防火墙端口

    >>> 开启端口 firewall-cmd --zone=public --add-port=/tcp --permanent  命令含义: --zone #作用域 --add-po ...

  8. CUDA库函数使用笔记与案例(一)

    项目合作中需要整合对方公司提供的CUDA代码,因此需要详细学习代码中涉及的cuda函数. CUDA Tool Kit 8.0较完整的官方说明文档: http://docs.nvidia.com/cud ...

  9. linux下如何启动和关闭weblogic .

    在你定义的域中可以找到如下命令: /[youHome]/domains/[yourDomain]/startWebLogic.sh /[youHome]/domains/[yourDomain]/st ...

  10. vue.js 源代码学习笔记 ----- instance index

    import { initMixin } from './init' import { stateMixin } from './state' import { renderMixin } from ...