贴下主要源码,具体有优化socket部分,没做异常处理,此码只为测试。
/// <summary>
/// stream转byte[]
/// </summary>
static byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
//设置当前流的位置为流的开始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
/// <summary>
/// byte[]转Stream
/// </summary>
static Stream BytesToStream(byte[] bytes)
{
Stream stream = new MemoryStream(bytes);
return stream;
}
/// <summary>
/// GZipStream压缩字符串
/// </summary>
static Stream GZipCompress(string str)
{
MemoryStream msReturn;
byte[] buffer = Encoding.UTF8.GetBytes(str);
using (MemoryStream msTemp = new MemoryStream())
{
using (GZipStream gz = new GZipStream(msTemp, CompressionMode.Compress, true))
{
gz.Write(buffer, 0, buffer.Length);
gz.Close();
msReturn = new MemoryStream(msTemp.GetBuffer(), 0, (int)msTemp.Length);
}
}
return msReturn;
}
class resultmodel
{
public int code { get; set; }
public bool success { get; set; }
public string msg { get; set; }
public object data { get; set; }
}
socket部分:
static void loadfile()
{
//本机的loopback网络地址,即127.0.0.1
IPAddress address = IPAddress.Loopback;
//创建可以访问的端点,49152表示端口号,如果设置为0,表示使用一个空闲的端口号
IPEndPoint endPoint = new IPEndPoint(address, 49152);
//创建socket,使用IPv4地址,传输控制协议TCP,双向、可靠、基于链接的字节流
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将socket绑定到端点上
socket.Bind(endPoint);
//设置链接队列的长度
socket.Listen(10);
Console.WriteLine("开始监监听,端口号:{0}", endPoint.Port);
bool tag = false;
while (!tag)
{
//开始监听,这个方法会阻塞线程的执行,直到接收到一个客户端的链接请求
Socket client = socket.Accept();
Console.WriteLine(client.RemoteEndPoint);
byte[] buffer = new byte[4096];
//接收数据
int length = client.Receive(buffer, 4096, SocketFlags.None);
//将请求的数据翻译为UTF-8
string requestString = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine(requestString);
//回应的消息
var data = new resultmodel { code = 100, success = true, msg = "请求成功" };
var responseString = JsonConvert.SerializeObject(data);
//GZip压缩
var stream = GZipCompress(responseString);
//发送内容到客户端
client.Send(StreamToBytes(stream)); //客户端会下载一个文件
client.Close();
//if (Console.KeyAvailable)
// break; //退出循环
tag = true;
}
//关闭监听
socket.Close();
Console.ReadKey();
}