网络编程


计算机网络 : 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

网络编程 : 在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换(可以通过我们编写的网络程序基于互联网去访问别人电脑上的程序和资源)

目前网络程序分为两种结构 : CS / BS
C / S结构 : 全称为Client / Server 结构,是指客户端和服务器结构,常见的程序有QQ,百度网盘等软件
特点 : 一般服务端仅仅安装了数据库和数据存储,几乎所有程序代码都写在客户端软件中
优点 : 直观,用户体验好,界面美观,安全性高等
缺点 : 每次软件升级,需要重新安装,移植性较低,开发和维护成本较高,代码不跨平台

B / S结构: 全称为 Browser / Server结构,是指浏览器和服务器结构,常见的浏览器有谷歌,火狐等
特点 : 在服务端编写代码,所有的业务逻辑都由服务端完成,客户端只负责接收数据进行渲染界面
优点 : 可移植性很高,开发维护较好
缺点 : 以前用户体验不够好,界面不够丰富,安全性较低

**新型 BS 结构 : **需求和技术发展的产物
瘦客户端 : 传统的 B/S, 服务端:负责业务逻辑 ; 客户端: 负责界面渲染
富客户端 : 超级B/S = C/S + B/S ,界面华丽,服务端: 负责业务逻辑 , 客户端:负责界面渲染 + 少量的业务逻辑

以上架构各有优势,但无论是哪种架构,都需要基于网络通信

网络通信三要素

IP地址

IP地址 : 互联网协议地址(Intemet Protocol Address) , IP地址是计算机在网络中的唯一标识,
域名 : 映射到某个ip的一组英文单词组合,如www.baidu.com , 为了想要访问这个地址的用户更好的记忆
常用命令
查看本机ip地址,在控制台输入

ipconfig

检查网络是否连通,在控制台输入

ping ip地址/域名
如 ping www.jd.com

特殊的IP地址
本机ip地址 : 127.0.0.1 , localhost

端口号

网络的通信,本质是两个进程(应用程序)的通信,每台计算机都有很多的进程,那么在网络通信时,端口号就是可以区别一台计算机中的唯一进程(应用程序)了
端口号 : 用两个字节表示的整数,它的取值范围是0-65535,其中,0-1023这个范围的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号,如果端口号被另一个服务或应用所占用,会导致当前程序启动失败

通信协议

网络通信协议 : 通信协议是计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信,协议中对数据的传输格式,传输速率,传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换

java.net包中提供了两种常见的网络协议的支持 : UDP和TCP

UDP 协议

UDP (User Datagram Protocol) 是⽆连接通信协议,不建⽴逻辑连接,当⼀台计算机向另外⼀台计算机发送数据时,发送端不会确认接收端是否存在,直接发数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

特点: ⾯向⽆连接的协议,消耗资源⼩,通信效率⾼,通常⽤于⾳频、视频等数据传输,因为偶尔丢失⼀两个数据包,不会对接收结果产⽣太⼤影响。
但是在使⽤ UDP 协议传送数据时,由于 UDP 的⾯向⽆连接性,不能保证数据的完整性,因此在传输重要数据时不建议使⽤ UDP 协议。

UDP通信过程如下图所示

TCP 协议

TCP(Transmission Control Protocol)协议是⾯向连接的通信协议,即在传输数据前先在客户端和服务器端建⽴逻辑连接,然后再传输数据。它提供了两台计算机之间可靠⽆差错的数据传输。

TCP通信过程如下图所示

TCP 协议特点

  • ⾯向连接的协议
  • 建⽴连接,形成传输数据的通道。
  • 传输数据⼤⼩不受限制
  • 通过三次握⼿完成连接。
  • 通过四次挥⼿断开连接。
  • TCP是基于 IO 流传输数据。
  • 因为需要建⽴连接,效率会稍低但是可靠协议

三次挥手完成连接

第⼀次握⼿: 客户端询问服务器端是在线
第⼆次握⼿: 服务器端通知客户端在线并询问客户端是否在线
第三次握⼿: 客户端通知服务器还在线
建⽴连接通道,开始做数据传输

四次挥⼿断开连接

第⼀次挥⼿: 客户端请求断开连接
第⼆次挥⼿: 服务器发送已经知道要断开,之后把数据发送完.
第三次挥⼿: 服务器发送完数据通知客户端正式断开
第四次挥⼿: 客户端告知服务器确定要断开并等待 2MSL 之后断开

涉及到数据安全不可丢失的,使⽤ TCP,BS 底层就是使⽤ TCP 协议.

基于 TCP ⽹络编程演示

书写基于⽹络来传输数据的两个程序.
成员和职责:
客户端: 往服务端程序发送数据,然后接收服务端返回的数据.(例如浏览器)
服务端: 接收客户端程序发送的数据,并做出反馈.

TCP编程-客户端

步骤:

  1. 创建⼀个连接某个服务端的 Socket 对象
  2. 从Socket中拿到输出流往服务端发送数据
  3. 调⽤Socket对象对象 shutdownOutput ⽅法通知服务端数据发送完毕
  4. 从Socket中拿到输⼊流获取服务端回馈的数据
  5. 调⽤Socket对象对象 shutdownInput ⽅法通知服务端数据接收完毕
  6. 关闭Socket对象
public class Demo {public static void main(String[] args) throws Exception {//创建⼀个连接某个服务端的 Socket 对象Socket socket = new Socket("127.0.0.1", 8888);//从Socket中拿到输出流往服务端发送数据OutputStream out = socket.getOutputStream();out.write("服务器,你好!".getBytes("UTF-8"));//调⽤Socket对象对象 shutdownOutput ⽅法通知服务端数据发送完毕socket.shutdownOutput();//从Socket中拿到输⼊流获取服务端回馈的数据InputStream is = socket.getInputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = is.read(buffer)) != -1){System.out.println(new String(buffer,0,len,"UTF-8"));}//调⽤Socket对象对象 shutdownInput ⽅法通知服务端数据接收完毕socket.shutdownInput();//关闭Socket连接对象socket.close();}}

TCP编程-服务端

步骤:

  1. 创建⼀个服务端对象(ServerSocket)
  2. 侦听客户端的连接,获取和客户端通信的Socket对象
  3. 从Socket获取输⼊流,接收服务器发送的数据
  4. 调⽤Socket对象对象shutdownInput⽅法通知客户端数据接收完毕
  5. 从Socket中拿到输出流往客户端发送数据
  6. 调⽤Socket对象对象shutdownOutput⽅法通知客户端数据发送完毕
  7. 关闭Socket对象
public class Demo {public static void main(String[] args) throws Exception {//创建⼀个服务端对象(ServerSocket)ServerSocket ss = new ServerSocket(8888);//侦听客户端的连接,获取和客户端通信的Socket对象(正常是死循环,因为有多个客户端)Socket accept = ss.accept();//从Socket获取输⼊流,接收服务器发送的数据InputStream is = accept.getInputStream();byte[] buffer = new byte[1024];int len = -1;while ((len = is.read(buffer)) != -1) {System.out.println(new String(buffer, 0, len, "UTF-8"));}//调⽤Socket对象对象shutdownInput⽅法通知客户端数据接收完毕accept.shutdownInput();//从Socket中拿到输出流往客户端发送数据OutputStream out = accept.getOutputStream();out.write("客户端,你好!".getBytes("UTF-8"));//调⽤Socket对象对象shutdownOutput⽅法通知客户端数据发送完毕accept.shutdownOutput();//关闭Socket对象accept.close();}}

注意: 服务端⼀般都是⻓期开启的,因为服务端⼀旦关闭就不能给客户端提供服务了.
最终⽬标: 浏览器和 Java 程序交互,能显示 Java 程序(数据库)中的数据.

浏览器和服务端程序交互

由于使⽤浏览器接收到的数据是⼀⾏⼀⾏,所有咱们把数据接收改为⼀⾏⼀⾏接收,反馈也改为⼀⾏⼀⾏输出

public class Demo {public static void main(String[] args) throws Exception {//创建⼀个服务端对象(ServerSocket)ServerSocket serverSocket = new ServerSocket(8888);while(true){//循环监听客户端发来的请求,开启线程去处理new Thread(new RequestHandler(serverSocket.accept())).start();}}
}//处理请求类
public class RequestHandler implements Runnable {private Socket socket;public RequestHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//将请求的信息放进缓存流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String info = "";while(!(info = br.readLine()).equals("")){//打印请求带来的信息System.out.println(info);}//接受请求完毕socket.shutdownInput();//响应字符串PrintStream printStream = new PrintStream(socket.getOutputStream());//响应行,响应头,响应内容printStream.println("HTTP/1.1 200 OK");printStream.println("Content-Type: text/html;charset=utf-8");printStream.println();printStream.println("<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +"    <meta charset=\"UTF-8\">\n" +"    <title>Title</title>\n" +"</head>\n" +"<body>\n" +"    成功访问到服务器\n" +"</body>\n" +"</html>");//响应完毕,关闭连接socket.shutdownOutput();socket.close();} catch (IOException e) {e.printStackTrace();}}
}


以上程序已经实现了可以和浏览器进⾏通信,但是存在许多的问题:

  1. 该程序在并发的情况下,效率低
  2. 启动服务绑定的端⼝是写死了,万⼀该端⼝被其他程序占⽤,则服务器⽆法启动
  3. 以上编程模型中的 IO 是属于阻塞IO,传输数据的效率极低等等.
    解决: 使⽤别⼈封装好,写好的服务端程序.(软件服务器: Tomcat)

Tomcat 服务器

什么是 web 资源

浏览器⽹⻚上看到的所有内容都称为 web 资源,⽐如⽂字,图⽚,⾳频,视频,链接等等内容。

Web资源分类

分类 概述 使⽤的技术
静态资源 静态资源是相对于动态资源⽽⾔,是指没有后台数据库、不含程序和⼀些不可交互的⽹⻚。你编的是什么它显示的就是什么、不会有任何改变。 HTML/CSS/JS
动态资源 动态资源会因时因⼈⽽异,以数据库为基础每次访问内容都可能不⼀样 JSP / Servlet

什么是服务器

服务器分类

软件服务器: 其实就是⼀个软件:提供了B(browser)/S(server)应⽤运⾏的环境(管理了Web应⽤) ,作⽤:可以将我们开发好的静态资源或动态资源提供给外界(浏览器)访问。
硬件服务器: 其实就是⼀台电脑,该电脑安装了软件服务器。

软件服务器分类

http 服务器:⽤于运⾏静态的⽹⻚(html)
Web服务器:实现了 JavaEE 部分规范(⽐如Servlet/JSP)、没有实现 JavaEE 中的 EJB 规范。常 ⽤的 Web服务器有:Tomcat(Java代码写的,开源的服务器), Jetty 等
应⽤服务器:实现了 JavaEE 全部的规范/⽀持 EJB 的 : TomEE,GlassFish,JBoss,Weblogic,WebSphere

JavaEE 规范

在 Java 中所有的服务器要实现⼀组 sun 公司规定的接⼝,这些接⼝称为 JavaEE 规范。不同⼚商的 JavaWeb服务器都实现了这些接⼝。在 JavaEE 中⼀共有 13 种规范。
常⻅的 JavaEE 规范有: JSP、Servlet、JDBC、XML、EJB

Tomcat 安装配置

Tomcat 下载

apache官⽹。www.apache.org
tomcat 的产品⻚⾯: http://tomcat.apache.org/

Tomcat安装

解压即完成安装!注意事项:安装路径不能包含中⽂或空格等特殊符号。

Tomcat 环境变量配置

Tomcat 是使⽤ Java 语⾔编写的⼀个服务器(程序),要运⾏Tomcat必须得有 jre。必须先配置 JAVA_HOME 或者JRE_HOME 的环境变量 ⼀般的我们只配置 JAVA_HOME。

Tomcat 启动和关闭

启动:双击 bin/startup.bat ,浏览器测试是否可以访问
关闭:运⾏的是 bin/shutdown.bat

修改 Tomcat 的端⼝号

Tomcat 的默认端⼝是 8080。但是 HTTP 协议的默认访问的端⼝是 80。所以在访问 8080 端⼝的 Tomcat 中的资源时,必须要加上端⼝号 http://localhost:8080/index.jsp
如果想在访问的时候不加端⼝号,我们可以将 tomcat 的端⼝号修改为80。
修改 Tomcat 安装⽬录下 /conf/server.xml ⽂件中默认第 69 ⾏,将 8080 修改为 80
配置⽂件改变后需要重新启动 Tomcat,然后访问地址上就不需要输⼊端⼝号了。

Tomcat ⽬录结构

⽬录名 作⽤
bin 启动和关闭Tomcat可执⾏⽂件
conf 配置⽂件夹,有些重要配置⽂件在这下⾯。如:server.xml, web.xml等 不建议乱修改,可能导致Tomcat不能启动
lib Tomcat使⽤时依赖的⼀些第三⽅jar包
logs ⽇志记录⽂件,记录服务器运⾏过程中⼀些事件。包括运⾏过程中出现异常
temp 临时⽂件夹,保存服务器运⾏过程中⽣成的⼀些垃圾⽂件
webapps 我们做好的项⽬发布的⽬录,可以通过浏览器来直接访问
ROOT⽬录 在浏览器上看到的欢迎⻚⾯,在这个⽬录下
work Tomcat ⼯作⽬录,存储 Tomcat 运⾏过程中产⽣的⽂件,⽐如 jsp 翻译后的class⽂件

Tomcat 部署项⽬

web项⽬标准结构

web 项⽬部署⽅式(运维人员掌握部署)

⽅式1:webapps
在 tomcat/webapps ⽬录下创建⼀个项目⽂件夹,将资源按照上面结构放在文件夹中,再启动猫

启动成功后通过IP地址:端口号/项目文件夹名/资源名 进行访问

⽅式2:虚拟⽬录(推荐)
⽅式1, 发布项⽬的缺点:发布在 webapps 下,webapps 项⽬越多,导致 Tomcat 启动越慢。

在conf/server.xml⽂件的 host 元素中配置 Context 标签 说明
path 属性 虚拟访问⽬录的名称,配置的名称必须是唯⼀的
docBase 属性 Web 应⽤所在⽬录

例如:将 pss 项⽬存放在:D://openSource/下
找到 tomcat/conf/server.xml ⽂件,在 host 元素写下⾯的代码

⽅式3:配置独⽴ xml ⽂件

  1. 在 tomcat/conf ⽬录下新建⼀个 Catalina⽬录(如果已经存在⽆需创建)
  2. 在Catalina ⽬录下创建 localhost ⽬录
  3. 在 localhost 中创建 xml 配置⽂件,名称可以任意:qq(注:这个名称是浏览器访问路径)
  4. 在 xml ⽂件添加内容为 < Context docBase=“D://openSource/pss” />
  5. 重启服务器并浏览器访问

IDEA 中部署项⽬(开发人员掌握)

我们要将 idea 和 tomcat 集成到⼀起,可以通过 idea 就控制 tomcat 的启动和关闭

  1. 编辑运⾏配置

  2. 添加 Tomcat 的配置信息,选择本地的猫

  3. 配置服务器详细信息

    第 1 次配置需要点击 Configure…按钮关联本地Tomcat安装路径

在 IDEA 部署 WEB 项⽬

  1. 创建 JavaWeb 项⽬

  2. 创建好的 WEB 项⽬结构
  3. 在web⽬录下创建⼀个 index.html⽂件
  4. 部署项⽬到 Tomcat 服务器 (编辑配置)点击 Deployemet (在导⼊项⽬时,是没有导⼊项⽬到tomcat 服务器,需要在此处去加⼊项⽬)


    点击 Server 可以看到所有详细信息
  5. 在 IDEA 中启动服务器

网络编程与Tomcat服务器相关推荐

  1. cocos网络通信php,cocos2d-x网络编程 连接php服务器笔记2

    cocos2d-x网络编程 连接php服务器笔记2 好了环境也搭建好了工具也有了那我们就开始写php程序吧,上节我们说了我们设置网站的本机目录为d:/phpWWW,你在里面新建个testPhp目录,名 ...

  2. Socket网络编程--简单Web服务器(6)

    本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...

  3. 多线程 python tcp 图片_Python第四周之网络编程TCP (服务器/客户端; 线程下载图片;线程版服务器和客户端(单人、多人)) UDP...

    # 网络编程 # 计算机网络, 把多台独立自主的计算机,连接到网络,实现资源的共享 # Internet网,(互联网)eniac 1946美国大学第一台电子计算机 # # 一个TCP报文除了包含要传输 ...

  4. Linux网络编程——tcp并发服务器(poll实现)

    https://blog.csdn.net/lianghe_work/article/details/46535859 想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程--I/ ...

  5. C# Socket网络编程入门(服务器与客户端通信,客户端与客户端通信)

    WebSocket全双工通讯链接,用于前台和后台自由发送信息 一.效果展示: 效果描述: 1.服务器充当管理员,给所有人发送信息,除服务器以外其他人都能接受到. 2.其他用户发送信息除自己以外其他用户 ...

  6. C/C++爬虫篇之网络编程(请求服务器)

    目录 C/C++套接字 C/C++请求服务器实现 先来张效果图: 1- C/C++套接字 在说明套接字之前,先简单了解客户端和服务器之间的关系.(往后再发TCP三次握手和四次挥手详细叙述过程) 1.T ...

  7. 网络编程(客户端和服务器的编写)

    一.网络发展的历史 1.中国的网络发展大概在2000年左右开始兴起,越来越多的能联网的游戏出现了,局域网联网,广域网联网. 局域网与广域网没有一个,明确的限制的,(中国的网络可以说是广域网也可以说是一 ...

  8. 网络/Network - 网络编程 - 高性能 - 单服务器高性能模式[网络模型]及性能对比 - 学习/实践

    1.应用场景 主要用于学习单服务器高性能模式及性能对比,尤其是网络模型,这个很重要,并将这些知识在工作中验证,实践,理解,掌握. 2.学习/操作 1.文档阅读 推荐 18 | 单服务器高性能模式:PP ...

  9. 网络编程3-高并发服务器

    并发:一个处理器同时处理多个任务,并行:多个处理器或者是多核的处理器同时处理多个不同的任务 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行 并发(concurrency):指 ...

最新文章

  1. 杨老师课堂_Java核心技术下之控制台模拟记事本案例...
  2. 单步调试_keil for arm 调试时无法单步运行及打断点
  3. 桌面云实验环境的部署配置
  4. 2022我会成为高手吗
  5. java数据类型_JAVA的数据类型
  6. Spring-学习笔记06【Spring的新注解】
  7. android handler、looper、message、messageQueue、
  8. easypoi导出excel 效率_Spring Boot 入门(十二):报表导出,对比poi、jxl和esayExcel的效率...
  9. brew安装PHP7 swoole
  10. 平滑滤波器模板尺寸与平滑效果的关系_Python Opencv 图像平滑处理
  11. mysql的回滚机制_mysql事务回滚机制概述
  12. 有钱人的学习能力,穷人该得好好模仿
  13. 最大的PHP开源网店系统ECShop简介
  14. 软件测试人员每天的工作日常
  15. 社会学转计算机博士,科学网—记我国社会计算学科第一位博士 - 王帅的博文
  16. html5压缩视频文件大小,格式工厂怎么压缩视频大小 只需5步大视频变小视频
  17. 物联网卡零售应用的真实案例
  18. iar定义arm版本_Keil MDK 和 IAR 两款ARM开发工具区别比较
  19. 5 Ways To Boost Typing Speed And Accuracy
  20. [附源码]java毕业设计房屋租赁系统

热门文章

  1. 【MATLAB教程案例80】matlab在大学数学中的应用——高等数学
  2. 人工智能之数学基础篇—高等数学基础(上篇)
  3. mui使用百度语音合成来制作文字转语音来播放
  4. windows环境中,pm2不是内部或外部命令的解决方案
  5. 写了个魔兽争霸辅助工具
  6. touch.js 移动端的手势识别
  7. 中职计算机英语教案全,2014中职计算机英语第一课时教学设计.doc
  8. 关于asp.net调用gemalto超级狗api的具体实现
  9. 前端小白如何赢在起跑线,实现高薪就业?
  10. matlab把三个矩阵连接起来,MATLAB:用一定的规则将3个矩阵连接成1个新矩阵