网络编程简介

这些知识点在学习计算机网络时都有详细讲,我这就简单介绍下,具体的看计算机网络相关知识。

1、软件结构

常见的软件结构有C/S和B/S

C/S (Client/Server)

表示客户端/服务器的软件结构,简单举例:QQ、微信、网盘客户端等,只要是需要我们下载安装,并且和服务器通信的这一类软件,都属于C/S的软件结构。结构如图:

用java开发windows 用JAVA开发的是B/S软件架构吗_端口号

B/S (Browser/Server)

表示浏览器/服务器的软件结构,例如淘宝网、京东商城等,只要是需要使用浏览器,并且和服务器通信的这一类软件,都属于B/S的软件结构,结构如图:

用java开发windows 用JAVA开发的是B/S软件架构吗_客户端_02

C/S和B/S各有优势:
(1)C/S在图形的表现能力上以及运行的速度上肯定是强于B/S的
(2)C/S/需要运行专门的客户端,并且它不能跨平台,用c++在windows下写的程序肯定是不能在linux下运行
(3)B/S不需要专门的客户端,只要系统中安装了浏览器即可访问,方便用户的使用。
(4)B/S是基于网页语言的、与操作系统无关,所以跨平台也是它的优势

无论是C/S结构的软件,还是B/S结构的软件,都离不开网络的支持。
网络编程,就是在一定的协议下,实现两台计算机的通信的程序

2、通信协议

2.1 概述

(1)通过计算机网络可以使多台计算机实现相互连接,位于同一个网络中的两台计算机,在进行连接和通信时,需要遵守一定的规则,这些连接和通信的规则就是网络通信协议

(2)通信协议,对俩台计算机之间所传输数据的传输格式、传输步骤等做了统一规定要求,通信双方必须同时遵守才能完成数据交换。

2.2 TCP/IP协议栈*

2.2.1 概述

传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),它是一系列网络协议的总和,是构成网络通信的核心骨架。它是互联网中最基本、使用最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在计算机之间进行传输。

2.2.2 结构

TCP/IP协议栈采用4层结构,分别是应用层、传输层、网络层、链路层,并且在每一层的内部,都包含了一系列用于处理数据通信的协议,分别负责不同的通信功能

  • 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
  • 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
  • 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
  • 应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等
2.2.3 数据传输过程

当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。

看图可能好理解点:

用java开发windows 用JAVA开发的是B/S软件架构吗_用java开发windows_03

3、TCP和UDP

完整的通信过程比较复杂,但是JavaAPI中把这些通信实现的细节进行了封装,使得我们可以直接使用相应的类和接口,来进行网络程序开发,而不用考虑通信的细节。
TCP和UDP是网络中非常重要的两个协议,java.net包中对常见的俩种通信协议进行了封装和支持。

UDP协议

UDP,用户数据报协议(User Datagram Protocol) (了解)
UDP是无连接通信协议,在数据传输时,数据的发送端和接收端不建立连接,也不能保证对方能接收成功
例如,当一台计算机向另外一台计算机发送数据时(UDP),发送端不会确认接收端是否存在,就会直接发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。(不安全,不建立连接)
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在传输重要数据时,不建议使用 UDP协议,因为它 不能保证数据传输的完整性

TCP,传输控制协议 (Transmission Control Protocol) (重要)
TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立连接,然后再传输数据,它提供了两台计算机之间可靠的、无差错的数据传输。在TCP连接中,将计算机明确划分为客户端与服务器端,并且由客户端向服务端发出连接请求,每次连接的创建都需要经过“**三次握手”**的过程。

下面简单说下三次握手是啥,听说是面试必问题,咋还没毕业,咋也不敢多问,但建议还是记牢,因为有用

第一次握手:客户端向服务器发送连接请求,等待服务器确认

用java开发windows 用JAVA开发的是B/S软件架构吗_网络_04

第二次握手:服务器端向客户端回复一个响应,统治客户端收到了连接请求

用java开发windows 用JAVA开发的是B/S软件架构吗_端口号_05

第三次握手:客户端再次向服务器端发送确认信息,确认连接

用java开发windows 用JAVA开发的是B/S软件架构吗_java_06

完成上述的三次握手后,客户端和服务器端的连接就已经建立了,在这个安全的、可靠的连接基础之上,就可以开始进行数据传输了。

4、IP和端口号

IP地址互联网协议地址(Internet Protocol Address)。IP地址用来给一个网络中的计算机设备做唯一的编号
端口号:网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,每个需要网络通信的进程(应用程序),都会占用系统的一个端口号。(或者可以理解为每个软件的唯一标识)

在网络中,通过IP可以找到对应的主机设备,而通过端口号,可以找到这个主机中正在运行的一个应用程序

查看本机IP地址:

ipconfig

查看本机与另外一台主机是否连通

ping ip地址

如:
ping www.baidu.com

用java开发windows 用JAVA开发的是B/S软件架构吗_端口号_07

127.0.0.1和localhost都能标识本机ip地址


端口号的取值范围是0~ 65535。其中,0~1023之间的端口号用于系统内部的使用普通的应用程序要使用1024以上的端口号即可,同时也要避免和一些知名应用程序默认的端口冲突

未来常用到的知名应用程序端口
oracle 1521
mysql 3306
redis 6379
tomcat 8080
。。。

如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

当发现你要使用的端口号被其他程序占用了,怎么办?
可以找到这个占用端口的进程PID是多少,然后把它强制杀死,不同的系统有不同的命令来杀死端口进程PID
这里以Windows和Ubuntu系统为例
Windows系统

//查看占用8888端口号的进程PID
netstat -aon|findstr 8888

//显示结果,找到占用8888端口号的PIDTCP    
0.0.0.0:8888    0.0.0.0:0   LISTENING    2696

//强制关闭(杀死)t
askkill /F /pid 2696

注意要是用管理员权限

Ubuntu系统

//查看占用8888端口号的进程PID
netstat -anp | grep :8888

//显示结果,找到占用8888端口号的PID
tcp    0    0 :::8888   :::*   LISTEN    3626/java      

//强制关闭(杀死)
 kill -9 3626

使用root账号的权限或者使用sudo命令