//监听本地的7890端口,限定接收的Socket为10个
string ip = "127.0.0.1";
string port = "7890";
//创建了一个负责监听的Socket.
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Parse(ip);//IP地址.
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Convert.ToInt32(port));
listenSocket.Bind(ipEndPoint);//监听的Socket绑定了一个通信的节点
listenSocket.Listen(10);//look一下数据有没有发过来,限制数量为10
Thread myThread = new Thread(new ThreadStart(delegate
{
BeginAccept(listenSocket);
}));
myThread.Start();
//开启了一个线程,这个线程while循环,再循环中监听Socket,如果发现有Socket请求,读取Socket的请求内容
/// <summary>
/// 监听,操作返回的Socket
/// </summary>
/// <param name="listenSocket"></param>
public void BeginAccept(Socket listenSocket)
{
bool isflag = true;
while (isflag)//负责监听的Socket一致要等待客户端数据。
{
Socket newSocket = listenSocket.Accept();
if (newSocket != null && newSocket.Connected)
{
#region 直接操作Socket
//思考:接收客户端发送过来的数据,这个数据如果过大如何处理?
byte[] buffer = new byte[1024 * 1024 * 5];
int receiveLength;
//接收客户端发送过来的数据,返回的是实际接收的数据的长度。
receiveLength = newSocket.Receive(buffer);
#endregion
if (receiveLength > 0)
{
#region 获取请求的数据
//获取请求报文,思考:如何确定编码格式?
string Request = Encoding.Default.GetString(buffer, 0, receiveLength);
Console.WriteLine(Request);
#endregion
#region 返回数据,向下看
#endregion
}
else
{ }
}
}
//返回数据
#region 响应报文
//按照请求报文中的回车换行符进行分割。
string[] msgs = Request.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
//获得当前服务器程序的运行目录
string ddir = AppDomain.CurrentDomain.BaseDirectory;
//从请求报文中获取了用户请求的文件的名称
string filePath = msgs[0].Split(' ')[1];
if (ddir.EndsWith(@"\bin\Debug\") || ddir.EndsWith(@"\bin\Release\"))
{
ddir = System.IO.Directory.GetParent(ddir).Parent.Parent.FullName;
}
string fullDir = ddir + filePath;//获取要返回文件的完整路径。
if (File.Exists(fullDir))
{
using (FileStream fileStream = new FileStream(fullDir, FileMode.Open, FileAccess.Read))
{
byte[] bufferRes = new byte[fileStream.Length];
fileStream.Read(bufferRes, 0, bufferRes.Length);
//构建响应报文。
StringBuilder builder = new StringBuilder();
builder.Append("HTTP/1.1 200 ok\r\n");
builder.Append("Content-Type:text/html;charset=utf-8\r\n");
//在相应报文头的最后一行下面有一个空行,所以在这里加两组"\r\n"
builder.Append("Content-Length:" + buffer.Length + "\r\n\r\n");
newSocket.Send(Encoding.Default.GetBytes(builder.ToString()));//返回响应头.
newSocket.Send(bufferRes);//返回文件流
}
}
else
{
string str = "不存在此文件";
byte[] bufferRes = Encoding.UTF8.GetBytes(str);
StringBuilder builder = new StringBuilder();
builder.Append("HTTP/1.1 200 ok\r\n");
builder.Append("Content-Type:text/html;charset=utf-8\r\n");
builder.Append("Content-Length:" + buffer.Length + "\r\n\r\n");
newSocket.Send(bufferRes);
}
#endregion
浏览器访问时的URL
http://localhost:7890/1.html
作者:FengYang
博客地址:http://blog.youkuaiyun.com/qq_28140365
版权声明:如果感觉文章哪里写的不对或者存在疑问,欢迎留言,共同学习、进步!
蓝色字体为链接