///<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. HDU 5694 分治+规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5694 此题一开始我也找到了规律,也知道是分治可是,,,想的太复杂了没写开, 我一直想的通过L,R两个参数分治,可 ...

  2. linux-Centos7安装php

    先安装相关依赖包 yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjp ...

  3. WKWebView的新特性与使用

    在WWDC2014中,苹果推出了最新的iOS8系统,其中也伴随着很多控件的更新与升级.其中全新的WebKit库让人很是兴奋.本文也将讲解到WebKit中更新的WKWebView控件的新特性与使用方法, ...

  4. pycharm git 提交使用情况

    在IDEA中进行分支切换时,出现如此错误,导致无法正常切换: error: The following untracked working tree files would be overwritte ...

  5. CentOS 6.3从自带的Pyhon版本

    本文介绍CentOS 6.3从自带的Pyhon版本是2.6升级到2.7.6的方法. 因为CentOS系统中旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装. 1.下载Py ...

  6. 018——VUE中v-for操作对象与数值

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 【LeetCode-128】Longest Consecutive Sequence

    描述 输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) . 输入 54,55,300,12,56 输出 3 通常我们看有没有连续序列时 找某个数有没有的前后的数,比如看到5 ...

  8. 拒绝了对对象 'sp_OACreate' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。

    执行一个存储过程, 由于里面使用到了一些 --创建对象  EXEC sp_OACreate 'VBScript.RegExp', @objRegex OUT  --设置属性  EXEC sp_OASe ...

  9. Python 读取window下UTF-8-BOM 文件

    with open('target.txt', 'r', encoding='utf_8_sig') as fp: print(fp.read())

  10. eureka-6-为Eureka Server 及Dashboard 添加用户认证

    Eureka Server 默认是允许匿名访问的你,当然也可以加认证权限 添加步骤: 1:在pom.xml文件中添加spring-boot-start-starter-security 的依赖.该依赖 ...