[正文]网络通信-Socket仿简单IIS

本文介绍了一个简单的TCP服务器实现,该服务器监听特定端口并接收客户端连接请求。当收到请求时,服务器会读取客户端发送的数据,并根据请求返回指定文件的内容。

//监听本地的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

版权声明:如果感觉文章哪里写的不对或者存在疑问,欢迎留言,共同学习、进步!

蓝色字体为链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值