网络编程中服务器端与浏览器的交互的问题

简介: 网络编程中服务器端与浏览器的交互的问题

服务端代码:

//服务器端
public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动==========");

        while(!serverSocket.isClosed()){
            Socket socket = serverSocket.accept();  //阻塞,等待连接

            System.out.println("与 " + socket.toString() + "连接成功");
            try{
                // I/O
                InputStream inputStream = socket.getInputStream();      //接收数据流
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

                String message;
                while((message = reader.readLine())!= null){
                    if(message.length() == 0) break;
                    System.out.println(message);
                }
                System.out.println("接收到来至:" + socket.toString() + "的数据");
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

服务器端启动:
在这里插入图片描述
使用浏览器与服务器端交互
localhost:8888
在这里插入图片描述回到服务器端查看输出:
在这里插入图片描述
浏览器与服务器端建立连接成功,并遵循HTTP协议发出请求数据包:
在这里插入图片描述
HTTP协议中请求数据头通常包括四个部分:

  1. 请求行,包括:请求类型,资源路径以及HTTP版本等信息。
  2. 请求头部,紧接着请求行之后的部分,用来说明服务器要使用的附加信息。
  3. 空行,请求头部后面的空行,是必须的。
  4. 请求数据,也叫主体,可以添加任何数据。

在这个例子中请求数据为空。

在上面,浏览器与服务器端交互时,提示网页无法运行。

这是因为,服务器端没有对浏览器发出的请求做出响应。我们需要在服务器端编写响应浏览器的代码。

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动==========");

        while(!serverSocket.isClosed()){
            Socket socket = serverSocket.accept();  //阻塞,等待连接

            System.out.println("与 " + socket.toString() + "连接成功");
            try{
                // I/O
                InputStream inputStream = socket.getInputStream();      //接收数据流
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

                String message;
                while((message = reader.readLine())!= null){
                    if(message.length() == 0) break;
                    System.out.println(message);
                }
                System.out.println("接收到来至:" + socket.toString() + "的数据");


                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
                outputStream.write("Content-Length:11\r\n\n".getBytes());
                outputStream.write("Hello World!".getBytes());
                outputStream.flush();
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

浏览器重新访问:localhost:8888
在这里插入图片描述
得到响应结果。

附:HTTP协议——响应状态码

  • 1XX(临时响应)

表示临时响应并需要请求者继续执行操作的状态代码

  • 2XX(成功)

表示成功处理了请求的状态代码。

  • 3XX(重定向)

表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。

  • 4XX(请求错误)

这些状态代码表示请求可能出错,妨碍了服务器的处理。

  • 5XX(服务器错误)

这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

目录
相关文章
|
22天前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
58 1
|
1月前
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
35 5
|
22天前
|
监控 安全 数据挖掘
网络游戏服务器如何有效防护DDoS与CC攻击
随着网络游戏行业的蓬勃发展,其背后的服务器架构日益复杂,同时也面临着前所未有的网络安全威胁。其中,分布式拒绝服务(DDoS)和CC(Challenge Collapsar,一种针对网页的攻击方式)攻击尤为突出,它们通过大量伪造请求或恶意流量,使服务器资源耗尽,导致服务中断或响应缓慢。因此,保障网络游戏服务器的安全,有效防护DDoS与CC攻击,已成为游戏行业亟待解决的问题。
|
2天前
|
存储 弹性计算 测试技术
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
阿里云服务器ECS实例可以分为多种实例规格族。根据CPU、内存等配置,一种实例规格族又分为多种实例规格。而实例规格又包含vCPU、处理器、内存、vTPM、本地存储、网络带宽、网络收发包PPS、连接数、弹性网卡、云盘带宽、云盘IOPS等指标,本文为大家详细介绍实例规格的这些指标,以供大家了解和选择。
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
|
7天前
|
存储 运维 网络协议
运维的基本概念:服务器和网络基础知识
运维的基本概念:服务器和网络基础知识
19 0
运维的基本概念:服务器和网络基础知识
|
1月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
35 6
|
1月前
|
缓存 安全 Linux
本地YUM源大揭秘:搭建您自己的Linux软件宝库,从此告别网络依赖!一文掌握服务器自给自足的终极技能!
【8月更文挑战第13天】在Linux中,YUM是一款强大的软件包管理工具,可自动处理依赖关系。为适应离线或特定安全需求,本指南教你搭建本地YUM源。首先创建存放软件包的`localrepo`目录,复制`.rpm`文件至其中。接着,安装并运用`createrepo`生成仓库元数据。随后配置新的`.repo`文件指向该目录,并禁用GPG检查。最后,清理并重建YUM缓存,即可启用本地YUM源进行软件搜索与安装,适用于网络受限环境。
68 3
|
19天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
42 0
|
26天前
|
存储 网络协议 物联网
网络中的“客户端”和“服务器
【8月更文挑战第24天】
33 0
|
1月前
|
网络安全 数据安全/隐私保护 iOS开发
【Mac os】如何在服务器上启动Jupyter notebook并在本地浏览器Web端环境编辑程序
本文介绍了如何在服务器上启动Jupyter Notebook并通过SSH隧道在本地浏览器中访问和编辑程序的详细步骤,包括服务器端Jupyter的启动命令、本地终端的SSH隧道建立方法以及在浏览器中访问Jupyter Notebook的流程。
50 0