使用ServerSocket,模拟B/S服务器,及使用浏览器,访问自己本地的网页。

最近学到了网络编程,有个练习:
模拟B\S服务器 模拟网站服务器,使用浏览器访问自己编写的服务端程序,查看网页效果。
踩了两个坑,就是:

  • ①HTTPS,不能用这个协议,来访问,因为这玩意是加密了的,一开始我还以为它传的不是UTF-8,因为我用的IDEA,默认UTF-8,我还用InputStreamReader去转换,但是发现没法,后来,突然想起了,HTTPS是加密的,然后用HTTP试了,就可以了。
  • ②网站输入的地址,可以用绝对路径,也可用相对路径,相对路径是相对于我们写的服务端类的项目位置比如我的服务端: 我们的地址就要这样输入:
  • http://localhost:8888/Advanced/src/Net/BSTCP/web/index.html

(15)4LJ0R(92LYVW27ZTY.png

注意事项:

  • ①这个是HTTP的响应头是固定的格式,需要注意:
    Http响应头要固定:
  • ②谷歌看不了,建议换其他浏览器看。
    // 写入HTTP协议响应头,固定写法
      os.write("HTTP/1.1 200 OK\r\n".getBytes());
      os.write("Content‐Type:text/html\r\n".getBytes());
      // 必须要写入空行,否则浏览器不解析
      os.write("\r\n".getBytes());
    

写代码思路

  1. 客户端是网站,我们只写服务端
  2. 需要写两个服务端,一个是向客户端发送html代码,一个是发送图片
  3. 建立连接时,需要使用HTTP协议,而不能使用HTTPS协议,这个协议被加密了,所以客户端只能输出加密的请求头。
  4. 服务端的执行步骤:
    1. 先创建ServerSocket,监听请求,接收到了,就使用accept( )捕获。
    2. 利用网络输入流,读取客户端请求头,然后获取Get请求,其中的文件地址。
    3. 处理地址格式
    4. 使用本地文件流,读取文件,并向客户端输出
    5. 在创建一个传输照片的服务端,与传输html的服务端代码几乎一样,差别在于,传输照片服务端,要一直监听请求,因为他传输的不是一张照片
    6. 优化:
      使用多线程,加快传输效率

下面放出全部代码:
html服务端:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//http://localhost:8888/Advanced/src/Net/BSTCP/web/index.html HTTP/1.1
//不能使用https,加密协议
public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动,等待连接。。。。");
        //创建一个服务器ServerSocket,和系统要指定的端口号
        ServerSocket server = new ServerSocket(8888);
        //使用accept方法获取到请求的客户端对象(浏览器)
        Socket socket = server.accept();
        //使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();

        //输出客户端的请求
        /*byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        System.out.println("cao");*/

        //把is字节流,转换成字符流,并且使用缓冲流读取
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        //读取第一行GET请求的内容
        String s = br.readLine();
        //按空格把它分开
        String[] s1 = s.split(" ");
        //把前面的"/"给排除,使用字符串的截取
        String path = s1[1].substring(1);
        System.out.println(path);

        //创建一个fis流,读取本地的index.html文件
        FileInputStream fis = new FileInputStream(path);
        //获取网络输出流OutputStream,向客户端输出页面
        OutputStream os = socket.getOutputStream();

        // 写入HTTP协议响应头,固定写法
        os.write("HTTP/1.1 200 OK\r\n".getBytes());
        os.write("Content‐Type:text/html\r\n".getBytes());
        // 必须要写入空行,否则浏览器不解析
        os.write("\r\n".getBytes());

        //向客户端输出
        byte bytes[] = new byte[1024];
        int len = 0;
        while((len = fis.read(bytes))!=-1){
            os.write(bytes);
        }
        //关闭资源
        fis.close();
        br.close();
        socket.close();

    }
}

照片服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ImageServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动,等待连接。。。。");
        //创建一个服务器ServerSocket,和系统要指定的端口号
        ServerSocket server = new ServerSocket(8888);
        while (true){
            //使用accept方法获取到请求的客户端对象(浏览器)
            Socket socket = server.accept();
            //使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
            InputStream is = socket.getInputStream();

            //输出客户端的请求
            /*byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            System.out.println(new String(bytes,0,len));
            System.out.println("cao");*/

            //多线程,加快传输速度
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        //把is字节流,转换成字符流,并且使用缓冲流读取
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));

                        //读取第一行GET请求的内容
                        String s = br.readLine();
                        //按空格把它分开
                        String[] s1 = s.split(" ");
                        //把前面的"/"给排除,使用字符串的截取
                        String path = s1[1].substring(1);
                        System.out.println(path);

                        //创建一个fis流,读取本地的index.html文件
                        FileInputStream fis = new FileInputStream(path);
                        //获取网络输出流OutputStream,向客户端输出页面
                        OutputStream os = socket.getOutputStream();

                        // 写入HTTP协议响应头,固定写法
                        os.write("HTTP/1.1 200 OK\r\n".getBytes());
                        os.write("Content‐Type:text/html\r\n".getBytes());
                        // 必须要写入空行,否则浏览器不解析
                        os.write("\r\n".getBytes());

                        //向客户端输出
                        byte bytes[] = new byte[1024];
                        int len = 0;
                        while((len = fis.read(bytes))!=-1){
                            os.write(bytes);
                        }
                        //关闭资源
                        fis.close();
                        br.close();
                        socket.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }).start();


        }

    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用C#中的HttpListener类来创建本地服务器,然后将本地HTML文件作为响应发送给浏览器。 以下是一个简单的示例代码,将本地文件夹作为Web服务器: ``` using System; using System.IO; using System.Net; namespace LocalServer { class Program { static void Main(string[] args) { string folderPath = @"C:\MyWebsite\"; HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://localhost:8080/"); listener.Start(); Console.WriteLine("Listening..."); while (true) { HttpListenerContext context = listener.GetContext(); string requestUrl = context.Request.Url.LocalPath; Console.WriteLine("Request: " + requestUrl); string filePath = folderPath + requestUrl; if (File.Exists(filePath)) { byte[] responseBytes = File.ReadAllBytes(filePath); context.Response.ContentType = "text/html"; context.Response.ContentLength64 = responseBytes.Length; context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); } else { context.Response.StatusCode = 404; } context.Response.Close(); } } } } ``` 在此示例中,我们使用HttpListener来监听localhost的8080端口,并将请求路由到本地文件夹中的HTML文件。如果找到文件,我们将其作为响应发送回浏览器。如果文件不存在,则返回HTTP 404响应。 要使用浏览器访问本地服务器,请打开您喜欢的浏览器,并在地址栏中输入“http://localhost:8080/”(或您选择的端口号)。浏览器应该会显示您本地文件夹中的HTML文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值