监听端口,输出HTML

本文介绍了一个简单的使用C#实现的Web服务器搭建过程。通过监听指定端口并接收客户端请求,服务器能够响应HTTP请求并返回静态内容。代码示例中包含了基本的HTTP报文处理和返回固定网页的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用监听功能,输出一个Web功能

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;

namespace Listener
{
    class Program
    {
        private static Thread th;//线程
        private static TcpListener tcpl;//监听
        public static bool listenerrunning = true;
        /// <summary>
        /// 主程序
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            th = new Thread(new ThreadStart(listener));
            th.Start();
        }
        /// <summary>
        /// 启动监听端口
        /// </summary>
        public static void listener()
        {
            try
            {
                tcpl = new TcpListener(5566);
                tcpl.Start();
                Console.WriteLine("监听端口5566开始.......");
                while (listenerrunning)
                {
                    Socket s = tcpl.AcceptSocket();

                    string remote = s.RemoteEndPoint.ToString();
                    Byte[] stream = new Byte[80];
                    int i = s.Receive(stream);//接受连接请求的字节流
                    string msg = "<" + remote + ">" + System.Text.Encoding.UTF8.GetString(stream);

                    StringBuilder buf = new StringBuilder();

                    #region================================输入http报头============================================================

                    buf.Append("HTTP/1.1 200 OK\r\n");
                    buf.Append("Content-Type: text/html\r\n");//html返回

                    //buf.Append("Content-Type: text/xml\r\n");//xml返回

                    buf.Append("Accept-Ranges: bytes\r\n");
                    buf.Append("Content-Length: 38\r\n");
                    buf.Append("\r\n");

                    #endregion

                    buf.Append("<html><body>hello world </body></html>");

                    s.Send(System.Text.Encoding.UTF8.GetBytes(buf.ToString()));

                    Console.WriteLine(msg);//在控制台显示字符串
                }
            }
            catch (Exception e)
            {
                stop();
                throw e;
            }
        }
        /// <summary>
        /// 取消监听和线程
        /// </summary>
        public static void stop()
        {
            listenerrunning = false;
            tcpl.Stop();
            th.Abort();
        }
    }
}

效果如下:




<think>我们根据用户需求:使用Docker Compose部署Nginx,要求使用host网络,并配置HTTP监听33000端口。 注意:使用host网络意味着容器将直接使用宿主机的网络栈,因此端口映射(ports)将不再需要(实际上,如果使用host网络,则端口映射会被忽略,因为容器端口直接绑定到宿主机端口)。但是,用户要求监听33000端口,因此我们需要在Nginx配置中指定监听33000端口。 步骤: 1. 创建docker-compose.yml文件。 2. 在docker-compose.yml中,设置网络模式为host。 3. 由于使用host网络,我们不需要进行端口映射(ports字段),但需要确保Nginx配置文件中监听33000端口。 4. 有两种方式配置Nginx: a. 使用自定义的nginx配置文件挂载到容器中。 b. 在docker-compose.yml中使用command或entrypoint覆盖默认命令,指定监听33000端口(但更推荐使用配置文件)。 我们选择使用自定义配置文件的方式,这样更灵活。 具体操作: - 在宿主机上创建一个目录(例如:/path/to/nginx-conf),并在其中创建nginx.conf文件。 - 在nginx.conf中,配置server块监听33000端口。 - 在docker-compose.yml中,将自定义配置文件挂载到容器的/etc/nginx/nginx.conf位置(或者根据具体镜像,可能挂载到/etc/nginx/conf.d/default.conf,但为了覆盖默认配置,我们直接替换主配置)。 注意:不同的Nginx镜像可能有不同的默认配置路径。我们以官方nginx镜像为例,它的主配置文件是/etc/nginx/nginx.conf,但通常它会包含/etc/nginx/conf.d/目录下的所有.conf文件。为了简单,我们直接替换主配置文件。 但是,用户要求使用host网络,所以我们在docker-compose.yml中指定network_mode: host。 由于使用host网络,容器将不会创建自己的网络命名空间,而是直接使用宿主机的网络接口。因此,在容器内监听端口就是宿主机上的端口。 我们编写docker-compose.yml如下: 首先,创建目录结构: project/ ├── docker-compose.yml └── nginx-conf/ └── nginx.conf 其中,nginx.conf的内容至少包含以下部分(监听33000端口): ``` events { worker_connections 1024; } http { server { listen 33000; location / { root /usr/share/nginx/html; index index.html index.htm; } } } ``` 然后,docker-compose.yml的内容如下: ```yaml version: '3' services: nginx: image: nginx:latest container_name: my-nginx network_mode: "host" # 使用host网络模式 volumes: - ./nginx-conf/nginx.conf:/etc/nginx/nginx.conf # 挂载自定义配置文件 restart: unless-stopped ``` 注意:使用host网络模式时,不能与其他服务共享网络配置,且端口映射(ports)会被忽略。另外,在Docker Compose v3中,host网络模式需要在每个服务下单独指定,不能通过顶级networks定义。 这样,当启动容器后,Nginx就会在宿主机的33000端口监听HTTP请求。 启动命令: docker-compose up -d 验证: curl http://localhost:33000 但是请注意:使用host网络模式时,容器将完全共享宿主机的网络命名空间,包括端口。因此,如果宿主机上已经有服务占用了33000端口,那么Nginx将无法启动。 另外,由于使用了host网络,容器中看到的网络接口和端口状态与宿主机完全一致。 如果用户需要更复杂的配置,可以在自定义的nginx.conf中添加。 根据引用[1]和引用[2]中提到的自定义容器名称和配置方式,我们采用了类似的方法。 因此,我们提供上述配置作为解决方案。 注意:在Linux上,使用host网络模式是直接支持的,但在Mac和Windows上,host网络模式可能有所不同(在Mac和Windows的Docker Desktop中,host网络模式实际上并不等同于Linux的host网络,可能会有限制)。因此,如果用户是在Linux上部署,则没有问题。 如果用户需要在非Linux系统上使用,可能需要考虑其他方式,但用户明确要求使用host网络,所以我们按照Linux环境来配置。 生成相关问题: 1. 如何验证Nginx是否成功监听33000端口? 2. 使用host网络模式有哪些优缺点? 3. 如何为Nginx配置多个端口监听? 4. 如何查看Docker容器使用host网络时的日志? 5. 如何自定义Nginx的其他配置(如负载均衡、反向代理等)?</think>### Docker Compose部署Nginx配置(Host网络+HTTP 33000端口) 以下是完整的`docker-compose.yml`配置文件,实现Nginx使用host网络模式并监听33000端口的HTTP服务: ```yaml version: '3.8' services: nginx: image: nginx:latest container_name: nginx-host network_mode: host # 使用宿主机网络栈 volumes: - ./nginx.conf:/etc/nginx/nginx.conf # 挂载自定义配置 restart: unless-stopped ``` **关键配置说明**: 1. `network_mode: host` - 容器直接使用宿主机的网络命名空间,无需端口映射 - 容器内监听端口直接绑定到宿主机(如33000端口)[^1][^2] 2. **必需的自定义Nginx配置**(`nginx.conf`): ```nginx events { worker_connections 1024; } http { server { listen 33000; # 监听33000端口 server_name localhost; location / { root /usr/share/nginx/html; index index.html; } } } ``` **部署步骤**: 1. 创建项目目录: ```bash mkdir nginx-host && cd nginx-host ``` 2. 创建配置文件: ```bash echo -e "events { worker_connections 1024; }\n\nhttp {\n server {\n listen 33000;\n location / { root /usr/share/nginx/html; }\n }\n}" > nginx.conf ``` 3. 启动服务: ```bash docker-compose up -d ``` **验证服务**: ```bash curl http://localhost:33000 # 应返回Nginx欢迎页 ``` **注意事项**: 1. 使用host网络时: - 容器直接使用宿主机IP,无需端口映射(`ports`配置无效) - 容器内服务需监听未被占用的端口(如33000) - 防火墙需放行对应端口:`sudo ufw allow 33000/tcp` 2. 自定义配置建议: - 添加SSL配置可实现HTTPS:`listen 33000 ssl;` - 挂载HTML目录:`- ./html:/usr/share/nginx/html` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值