C# Socket Post File
///<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的更多相关文章
- MySQL5.7报错[ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock的解决方法
发现MySQL服务器因系统磁盘写满导致服务停了,清理磁盘后启动服务时无法正常启动,查看localhost.err日志发现如下报错: [ERROR] Unix socket lock file is e ...
- flash as3 socket安全服务网关(socket policy file server)
关键字: SecurityErrorEvent socket as3 flash有着自己的一套安全处理模式,在socket方面,我这样的菜鸟无法理解他的好处:一句话,不怀好意的人如果想用flash写一 ...
- socket (一)
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...
- Socket网络编程一
1.Socket参数介绍 A network socket is an endpoint of a connection across a computer network. Today, most ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- Python之路,Day8 - Python基础 面向对象高级进阶与socket基础
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
- Python之路第一课Day8--随堂笔记(socket 承接上节---网络编程)
本节内容 Socket介绍 Socket参数介绍 基本Socket实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 作业:开发一个支持多用户在线的FTP程 ...
- Android—基于Socket与上传图片到客户端
最近项目中需要客户端和Socket互相传递数据时候需要相互传递图片所以做下总结以免以后忘记,也希望给大家带来帮助. 先上客户端的代码: 根据图片名称上传照相机中单个照片(此方法为自己封装) 参数所代表 ...
- 冰冻三尺非一日之寒-socket
第八章 Socket语法及相关 SocketServer实现多并发 socket概念: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket又称&q ...
随机推荐
- maven-surefire-plugin的forkMode分析
Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的.forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成. <p ...
- 基于vue-cli,测试非父子传值时,碰到 keep-alive的神奇
非父子传值测试 一直都很好奇非父子传值到底如何,结果入坑许久才爬出来,才知道在脚手架里测试就是坑. 问题: 测试非父子传值时,由于组件之间是通过路由进行跳转,值传过去又被刷掉 思路: 因为路由跳转,相 ...
- inline-block 文字与图片不对齐
文字旁边搭配图片时,发现图片比文字靠上,原来默认的情况是图片顶对齐而文字底对齐,通过设置css属性可以使得图片与文字对齐. 设置各对象的vertical-align属性,属性说明: baseline- ...
- centos7 iptables替换firewall
Disable Firewalld Service. [root@rhel-centos7-tejas-barot-linux ~]# systemctl mask firewalld Stop Fi ...
- 二十三、DBMS_METADATA(提供提取数据库对象的完整定义的接口)
1.概述 作用:提供提取数据库对象的完整定义的接口.这些定义可以用XML或SQL DDL格式描述.提供两种类型接口:可编程控制的接口:用于Ad Hoc查询的简单接口. 2.包的组成 dbms_meta ...
- 极简MarkDown教程(常用样式)
推荐编辑软件,NotePad++ & MarkDownViewer++(插件),以下内容为MarkDown格式,可自行放到编辑软件中查看,或在线查看 #### . 标题 > 用#+空格开 ...
- 【LeetCode 88_数组】Merge Sorted Array
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { ; ; ; &&a ...
- 关于$_SERVER['PHP_AUTH_USER']
http://www.cnblogs.com/thinksasa/p/3421379.html PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 ...
- 使用jQuery操作DOM(2)
1.获取设置属性值 attr({属性名1:属性值1,属性名2:属性值2}); //设置属性值 removeAttr(“属性名”); //删除属性 注意:如果元素没有此属性,会不起作用 2.获取同辈元素 ...
- [Python] json 报错'xxx is not JSON serializable'的处理方法
predictions = self.model.predict(x_data, verbose=0)[0] y_pred_idx = np.argmax(predictions) y_pred_pr ...