常见的软件结构有C/S和B/S
- C/S结构:Client/Server,表示客户端/服务器端的软件结构
例如:QQ,微信,等等,只要需要下载安装,并且和服务器通信的这一类软件,都属于C/S的软件结构
- B/S结构:Browser/Server,表示浏览器/服务器软件结构
例如:淘宝,京东等,只要是需要使用浏览器,并且和服务器,通信的这一类软件,都属于B/S的软件结构
C/S和B/S比较:
-
C/S在图形的表现能力上以及运行的速度上肯定强于B/S
-
C/S需要运行专门的客户端,并且他不能跨平台,用c++在windows下写的程序不能再Linux下运行
-
B/S不需要专门的客户端,只要系统中安装了浏览器即可访问,方便用户的使用
-
B/S是基于网页语言的,与操作系统无关,所以跨平台也是他的优势。
网络通信协议:
通过计算机网络可以使多台计算机实现相互连接,位于同一个网络中的两台计算机,在进行连接和通信时,需要遵守一定的规则,这些连接和通信的规则
通信协议,对两台计算机之间所传输数据的传输格式,传输步骤等做了统一规定要求,通信双方必须同时遵守才能完成数据交换
TCP/IP协议栈:传输控制协议/因特网互联协议,是一系列网络协议的总和,是构成网络通信的核心骨架。是互联网中最基本,使用最广泛的协议。
定义了计算机如何连入因特网,以及数据如何在计算机之间进行传输
TCP/IP协议栈采用4层结构:
- 链路层:用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,如光纤,网线提供驱动
- 网络层:是整个TC/IP协议的核心,主要是用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络
- 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,亦可以采用UDP协议
- 应用层:主要负责应用程序的协议,例如HTTP协议,FTP协议
TCP,传输控制协议 (Transmission Control Protocol)
TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立连接,然后再传输数 据,它提供了两台计算机之间可靠的、无差错的数据传输。
在TCP连接中,将计算机明确划分为客户端与服务器端,并且由客户端向服务端发出连接请求,每 次连接的创建都需要经过“三次握手”的过程。
TCP的三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的 可靠
- 第一次握手,客户端向服务器端发送连接请求,等待服务器确认
- 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
- 第三次握手,客户端再次向服务器端发送确认信息,确认连接
IP地址,互联网协议地址。ip地址用来给一个网络中的计算机设备做唯一编号
查看本地ip地址的命令:
ipconfig
查看本机与另一台主机是否连通:
ping ip地址
ping 10.0.1.129
表示本机ip地址:
127.0.0.1/localhost
端口号:网络的通信,本质上时两个进程(应用程序)的通信。每台计算机都有很多多的进程,每个需要网络通信的进程(应用程序),都会占用系统的一个端口号
在网络中,通过ip可以找到对应的主机设备,而通过端口号,可以找到这个主机中正在运行的一个应用程序
端口号的范围时065535,其中01023之间的端口号用于系统内部的使用。所以选择端口号的时候需要避免这些。
默认的端口号:
oracle启动后默认占用端口号1521,mysql启动后默认端口号3306,redis启动后默认占用端口号6379,tomcat启动后默认占用端口号8080
**查看某个端口的进程PID
Windows系统中执行命令
//查看正在使用的程序的端口号
netstat -aon
//查看某个端口号的进程PID
netstat -aon|findstr 端口号
//强制关闭(杀死)
taskkill /F /pid 2696
Ubuntu系统中执行命令:
//查看占用8888端口号的进程PID netstat -anp | grep :8888 //显示结果,找到占用8888端口号的PID tcp 0 0 :::8888 :::* LISTEN 3626/java //强制关闭(杀死) kill -9 3626
如果权限不足,可以使用root操作,或者使用sudo命令
5. TCP网络编程在TCP通信协议下,能实现两台计算机之间的数据交互,并且他们要严格区分客户端(Client)与服务器端(Server)
客户端和服务器端通信的步骤:
- 服务器端先启动,并占用一个指定的端口号,等待客户端的连接
- 客户端主动发起服务器端的连接,在连接成功后就可以进行数据发送了
在java中,对于这样基于TCP协议下连接通信的客户端和服务端,分别进行了抽象:
- java.net.Socket类表示客户端
- java.net.ServerSocket类表示服务器端
使用Socket和ServerSocket进行的编程,也称之为套接字编程
交互使用客户端(Socket)与服务器端(ServerSocket)交互
客户端和服务器端进行连接:
服务器端:
package toto2.网络编程12;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTCP {
public static void main(String[] args) {
int port=8889;
ServerSocket server=null;
Socket socket=null;
try {
server = new ServerSocket(port);
System.out.println("服务器启动,监听端口"+port+",等待客户端的连接");
socket= server.accept();
System.out.println("服务器接收到客户端的连接:"+socket);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(server!=null) {
try {
server.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
}
客户端:
package toto2.网络编程12;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTCP {
public static void main(String[] args) {
int port=8889;
ServerSocket server=null;
Socket socket=null;
try {
server = new ServerSocket(port);
System.out.println("服务器启动,监听端口"+port+",等待客户端的连接");
socket= server.accept();
System.out.println("服务器接收到客户端的连接:"+socket);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(server!=null) {
try {
server.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
}
让客户端可以从控制台接收用户的输入内容,然后再写给服务 器,然后再接收服务器写回来的数据
服务端代码
package toto2.网络编程12;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTcp1 {
public static void main(String[] args) {
int port = 8889;
ServerSocket server = null;
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
String encoding = "UTF-8";
try {
server = new ServerSocket(port);
System.out.println("服务器启动,监听端口" + port + ",等待客户端的连接");
socket = server.accept();
System.out.println("服务器接收到客户端的连接:" + socket);
// 获取输入流,读取客户端发送过来的内容
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
out = new PrintWriter(new
OutputStreamWriter(socket.getOutputStream(),encoding));
String line = null;
line = in.readLine();
System.out.println("服务器接收到客户端发送的信息" + line);
out.println("欢迎来到toto服务器!");
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (server != null) {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端代码
package toto2.网络编程12;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientTcp1 {
public static void main(String[] args) {
String host="127.0.0.1";
int port=8889;
Socket socket=null;
PrintWriter out =null;
BufferedReader in = null;
BufferedReader inFormConsole = null;
String encoding = "UTF-8";
try {
socket = new Socket(host,port);
out= new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
in = new BufferedReader(new
InputStreamReader(socket.getInputStream(),encoding));
//创建新的输入流,负责读取从控制台中读取用户输入的内容
inFormConsole = new BufferedReader(new
InputStreamReader(System.in,encoding));
String lineFromConsole = null;
lineFromConsole = inFormConsole.readLine();
out.println(lineFromConsole);
out.flush();
String line = null;
line = in.readLine();
System.out.println("客户端接收到服务器写回的是内容为:"+line);
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out!=null) {
out.close();
}
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
6. UDP网络
在UDP通信协议下,两台计算机之间进行数据交互,并不需要先建立连接,客户端直接往指定的IP和端 口号上发送数据即可,但是它并不能保证数据一定能让对方收到
java.net.DatagramSocket 和 java.net.DatagramPacket 是UDP编程中使用到的俩个类,客户端 和服务器端都使用这个俩类
java.net.DatagramSocket 负责接收和发送数据 java.net.DatagramPacket 负责封装要发送的数据和接收到的数据
7. URI与URLURI,统一资源标识符,用来唯一标识一个资源。
UPL统一资源定位符,是一种具体的URI,即URL可以用来标识一个资源,而且还指明如何定位这个资源。



