服务端:
public class AdvertisementSource : IDisposable
{
HttpListener httpListener;
bool stopped;
#region 构造和析构
//==
#region IDisposable
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
int disposedFlag;
~AdvertisementSource()
{
Dispose(false);
}
/// <summary>
/// 释放所占用的资源
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// 获取该对象是否已经被释放
/// </summary>
[System.ComponentModel.Browsable(false)]
public bool IsDisposed
{
get
{
return disposedFlag != 0;
}
}
#endregion
protected virtual void Dispose(bool disposing)
{
if (System.Threading.Interlocked.Increment(ref disposedFlag) != 1) return;
if (disposing)
{
httpListener.Stop();
}
//在这里编写非托管资源释放代码
}
#endregion
public void Initialize()
{
httpListener = new HttpListener();
httpListener.Prefixes.Add(string.Format("http://*:{0}/AdSource/", 8080));
httpListener.Start();
httpListener.BeginGetContext(GetHttpContextCallback, null);
}
public void GetHttpContextCallback(IAsyncResult iar)
{
if (stopped) return;
var context = httpListener.EndGetContext(iar);
httpListener.BeginGetContext(GetHttpContextCallback, null);
string endPoint = context.Request.RemoteEndPoint.ToString();
int spIndex = endPoint.IndexOf(":");
endPoint = endPoint.Substring(0, spIndex);
using (HttpListenerResponse response = context.Response)
{
{
HttpListener httpListener;
bool stopped;
#region 构造和析构
//==
#region IDisposable
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
int disposedFlag;
~AdvertisementSource()
{
Dispose(false);
}
/// <summary>
/// 释放所占用的资源
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// 获取该对象是否已经被释放
/// </summary>
[System.ComponentModel.Browsable(false)]
public bool IsDisposed
{
get
{
return disposedFlag != 0;
}
}
#endregion
protected virtual void Dispose(bool disposing)
{
if (System.Threading.Interlocked.Increment(ref disposedFlag) != 1) return;
if (disposing)
{
httpListener.Stop();
}
//在这里编写非托管资源释放代码
}
#endregion
public void Initialize()
{
httpListener = new HttpListener();
httpListener.Prefixes.Add(string.Format("http://*:{0}/AdSource/", 8080));
httpListener.Start();
httpListener.BeginGetContext(GetHttpContextCallback, null);
}
public void GetHttpContextCallback(IAsyncResult iar)
{
if (stopped) return;
var context = httpListener.EndGetContext(iar);
httpListener.BeginGetContext(GetHttpContextCallback, null);
string endPoint = context.Request.RemoteEndPoint.ToString();
int spIndex = endPoint.IndexOf(":");
endPoint = endPoint.Substring(0, spIndex);
using (HttpListenerResponse response = context.Response)
{
//get 的方式在如下解析即可得到客户端参数及值
//string userName = context.Request.QueryString["userName"];
//string password = context.Request.QueryString["password"];
//string suffix = context.Request.QueryString["suffix"];
//string adType = context.Request.QueryString["adtype"];//文字,图片,视频
if (!context.Request.HasEntityBody)//无数据
{
response.StatusCode = 403;
return;
}
string userName = "";
string password = "";
string suffix = "";
string adType = "";
//post 的方式有文件上传的在如下解析即可得到客户端参数及值
HttpListenerRequest request = context.Request;
if (request.ContentType.Length > 20 && string.Compare(request.ContentType.Substring(0, 20), "multipart/form-data;", true) == 0)
{
List<Values> lst = new List<Values>();
Encoding Encoding = request.ContentEncoding;
string[] values = request.ContentType.Split(';').Skip(1).ToArray();
string boundary = string.Join(";", values).Replace("boundary=", "").Trim();
byte[] ChunkBoundary = Encoding.GetBytes("--" + boundary + "\r\n");
byte[] EndBoundary = Encoding.GetBytes("--" + boundary + "--\r\n");
Stream SourceStream = request.InputStream;
var resultStream = new MemoryStream();
bool CanMoveNext = true;
Values data = null;
while (CanMoveNext)
{
byte[] currentChunk = ReadLineAsBytes(SourceStream);
if (!Encoding.GetString(currentChunk).Equals("\r\n"))
resultStream.Write(currentChunk, 0, currentChunk.Length);
if (CompareBytes(ChunkBoundary, currentChunk))
{
byte[] result = new byte[resultStream.Length - ChunkBoundary.Length];
resultStream.Position = 0;
resultStream.Read(result, 0, result.Length);
CanMoveNext = true;
if (result.Length > 0)
data.datas = result;
data = new Values();
lst.Add(data);
resultStream.Dispose();
resultStream = new MemoryStream();
}
else if (Encoding.GetString(currentChunk).Contains("Content-Disposition"))
{
byte[] result = new byte[resultStream.Length - 2];
resultStream.Position = 0;
resultStream.Read(result, 0, result.Length);
CanMoveNext = true;
data.name = Encoding.GetString(result).Replace("Content-Disposition: form-data; name=\"", "").Replace("\"", "").Split(';')[0];
resultStream.Dispose();
resultStream = new MemoryStream();
}
else if (Encoding.GetString(currentChunk).Contains("Content-Type"))
{
CanMoveNext = true;
data.type = 1;
resultStream.Dispose();
resultStream = new MemoryStream();
}
else if (CompareBytes(EndBoundary, currentChunk))
{
byte[] result = new byte[resultStream.Length - EndBoundary.Length - 2];
resultStream.Position = 0;
resultStream.Read(result, 0, result.Length);
data.datas = result;
resultStream.Dispose();
CanMoveNext = false;
}
}
foreach (var key in lst)
{
if (key.type == 0)
{
string value = Encoding.GetString(key.datas).Replace("\r\n", "");
if (key.name == "username")
userName = value;
if (key.name == "password")
password = value;
if (key.name == "suffix")
suffix = value;
if (key.name == "adtype")
adType = value;
}
if (key.type == 1)
{
FileStream fs = new FileStream("c:\\3.jpg", FileMode.Create);
fs.Write(key.datas, 0, key.datas.Length);
fs.Close();
fs.Dispose();
}
}
if (userName != "test" || password != "test" || string.IsNullOrEmpty(suffix) || string.IsNullOrEmpty(adType))
{
response.StatusCode = 403;
return;
}
int adtype = 0;
int.TryParse(adType, out adtype);
}
response.ContentType = "text/html;charset=utf-8";
try
{
using (System.IO.Stream output = response.OutputStream)
using (StreamWriter writer = new StreamWriter(output, Encoding.UTF8))
writer.WriteLine("接收完成!");
}
catch
{
}
response.Close();
}
}
byte[] ReadLineAsBytes(Stream SourceStream)
{
var resultStream = new MemoryStream();
while (true)
{
int data = SourceStream.ReadByte();
resultStream.WriteByte((byte)data);
if (data == 10)
break;
}
resultStream.Position = 0;
byte[] dataBytes = new byte[resultStream.Length];
resultStream.Read(dataBytes, 0, dataBytes.Length);
return dataBytes;
}
bool CompareBytes(byte[] source, byte[] comparison)
{
int count = source.Length;
if (source.Length != comparison.Length)
return false;
for (int i = 0; i < count; i++)
if (source[i] != comparison[i])
return false;
return true;
}
public class Values
{
public int type = 0;//0参数,1文件
public string name;
public byte[] datas;
}
}
//string userName = context.Request.QueryString["userName"];
//string password = context.Request.QueryString["password"];
//string suffix = context.Request.QueryString["suffix"];
//string adType = context.Request.QueryString["adtype"];//文字,图片,视频
if (!context.Request.HasEntityBody)//无数据
{
response.StatusCode = 403;
return;
}
string userName = "";
string password = "";
string suffix = "";
string adType = "";
//post 的方式有文件上传的在如下解析即可得到客户端参数及值
HttpListenerRequest request = context.Request;
if (request.ContentType.Length > 20 && string.Compare(request.ContentType.Substring(0, 20), "multipart/form-data;", true) == 0)
{
List<Values> lst = new List<Values>();
Encoding Encoding = request.ContentEncoding;
string[] values = request.ContentType.Split(';').Skip(1).ToArray();
string boundary = string.Join(";", values).Replace("boundary=", "").Trim();
byte[] ChunkBoundary = Encoding.GetBytes("--" + boundary + "\r\n");
byte[] EndBoundary = Encoding.GetBytes("--" + boundary + "--\r\n");
Stream SourceStream = request.InputStream;
var resultStream = new MemoryStream();
bool CanMoveNext = true;
Values data = null;
while (CanMoveNext)
{
byte[] currentChunk = ReadLineAsBytes(SourceStream);
if (!Encoding.GetString(currentChunk).Equals("\r\n"))
resultStream.Write(currentChunk, 0, currentChunk.Length);
if (CompareBytes(ChunkBoundary, currentChunk))
{
byte[] result = new byte[resultStream.Length - ChunkBoundary.Length];
resultStream.Position = 0;
resultStream.Read(result, 0, result.Length);
CanMoveNext = true;
if (result.Length > 0)
data.datas = result;
data = new Values();
lst.Add(data);
resultStream.Dispose();
resultStream = new MemoryStream();
}
else if (Encoding.GetString(currentChunk).Contains("Content-Disposition"))
{
byte[] result = new byte[resultStream.Length - 2];
resultStream.Position = 0;
resultStream.Read(result, 0, result.Length);
CanMoveNext = true;
data.name = Encoding.GetString(result).Replace("Content-Disposition: form-data; name=\"", "").Replace("\"", "").Split(';')[0];
resultStream.Dispose();
resultStream = new MemoryStream();
}
else if (Encoding.GetString(currentChunk).Contains("Content-Type"))
{
CanMoveNext = true;
data.type = 1;
resultStream.Dispose();
resultStream = new MemoryStream();
}
else if (CompareBytes(EndBoundary, currentChunk))
{
byte[] result = new byte[resultStream.Length - EndBoundary.Length - 2];
resultStream.Position = 0;
resultStream.Read(result, 0, result.Length);
data.datas = result;
resultStream.Dispose();
CanMoveNext = false;
}
}
foreach (var key in lst)
{
if (key.type == 0)
{
string value = Encoding.GetString(key.datas).Replace("\r\n", "");
if (key.name == "username")
userName = value;
if (key.name == "password")
password = value;
if (key.name == "suffix")
suffix = value;
if (key.name == "adtype")
adType = value;
}
if (key.type == 1)
{
FileStream fs = new FileStream("c:\\3.jpg", FileMode.Create);
fs.Write(key.datas, 0, key.datas.Length);
fs.Close();
fs.Dispose();
}
}
if (userName != "test" || password != "test" || string.IsNullOrEmpty(suffix) || string.IsNullOrEmpty(adType))
{
response.StatusCode = 403;
return;
}
int adtype = 0;
int.TryParse(adType, out adtype);
}
response.ContentType = "text/html;charset=utf-8";
try
{
using (System.IO.Stream output = response.OutputStream)
using (StreamWriter writer = new StreamWriter(output, Encoding.UTF8))
writer.WriteLine("接收完成!");
}
catch
{
}
response.Close();
}
}
byte[] ReadLineAsBytes(Stream SourceStream)
{
var resultStream = new MemoryStream();
while (true)
{
int data = SourceStream.ReadByte();
resultStream.WriteByte((byte)data);
if (data == 10)
break;
}
resultStream.Position = 0;
byte[] dataBytes = new byte[resultStream.Length];
resultStream.Read(dataBytes, 0, dataBytes.Length);
return dataBytes;
}
bool CompareBytes(byte[] source, byte[] comparison)
{
int count = source.Length;
if (source.Length != comparison.Length)
return false;
for (int i = 0; i < count; i++)
if (source[i] != comparison[i])
return false;
return true;
}
public class Values
{
public int type = 0;//0参数,1文件
public string name;
public byte[] datas;
}
}
客户端:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="http://127.0.0.1:8080/AdSource/">
<p>
<input id="File1" name="file1" type="file" /></p>
<p>
<input id="username" name="username" type="text" value="test" /></p>
<p>
<input id="password" name="password" type="text" value="test" /></p>
<p>
<input id="suffix" name="suffix" type="text" value="txt" /></p>
<p>
<input id="adtype" name="adtype" type="text" value="0"/></p>
<p>
<input id="Button1" type="submit" value="submit" /></p>
</form>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="http://127.0.0.1:8080/AdSource/">
<p>
<input id="File1" name="file1" type="file" /></p>
<p>
<input id="username" name="username" type="text" value="test" /></p>
<p>
<input id="password" name="password" type="text" value="test" /></p>
<p>
<input id="suffix" name="suffix" type="text" value="txt" /></p>
<p>
<input id="adtype" name="adtype" type="text" value="0"/></p>
<p>
<input id="Button1" type="submit" value="submit" /></p>
</form>
</body>
</html>