网络编程
七层网络模型
相关的协议(笔试题)
-
协议的概念
计算机在网络中实现通信就必须有一些约定或者规则,这种约定和规则就叫做通信协议,通信协议可以对速率、传输代码、代码结构、传输控制步骤、出错控制等制定统一的标准。 -
TCP协议
传输控制协议,是一种面向连接的协议,类似于打电话
-
UDP协议
用户数据报协议,是一种非面向连接的协议,类似于写信
IP地址
- 192.168.1.1 - 是绝大多数路由器的登录地址,主要配置用户名和密码以及Mac过滤
- IP地址是互联网中的唯一地址标识,本质上是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的还是IPv4
- 日常生活中采用点分十进制表示法来进行IP地址的描述,将每个字节的二进制转化为一个十进制整数,不同的整数之间采用小数点隔开。
- 如:
0x01020304 => 1.2.3.4 - 查看IP地址的方式:
Windows系统:在dos窗口中使用ipconfig或ipconfig/all命令即可
Unix/linux系统:在终端窗口中使用ifconfig或/sbin/ifconfig命令即可 - 特殊的地址
本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
端口号
- IP地址 - 可以定位到具体某一台设备。
- 端口号 - 可以定位到该设备中具体某一个进程。
- 端口号本质上是16位二进制组成的整数,表示范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,建议编程从1025开始使用。
- 特殊的端口:
HTTP:80 FTP:21 Oracle:1521 MySQL:3306 Tomcat:8080 - 网络编程需要提供:IP地址 + 端口号,组合在一起叫做网络套接字:Socket。
基于tcp协议的编程模型
C/S架构简介
C(client)就是客户端,S就是服务器端
- 在C/S模式下客户向服务器发出服务请求,服务器接收请求后提供服务
- 例如:在一个酒店中,顾客找服务员点菜,服务员把点菜单通知厨师,厨师按点菜单做好菜后让服
务员端给客户,这就是一种C/S工作方式。如果把酒店看作一个系统,服务员就是客户端,厨师就是服务器。这种系统分工和协同工作的方式就是C/S的工作方式 - 客户端部分:为每个用户所专有的,负责执行前台功能
- 服务器部分:由多个用户共享的信息与功能,招待后台服务
编程模型
-
服务器
1.创建ServerSocket类型的对象并提供端口号
2.等待客户端的连接请求,调用accept()方法;
3.使用输入输出流进行通信;
4.关闭Socket; -
客户端
1.创建Socket类型的对象并提供服务器的IP地址和端口号;
2.使用输入输出流进行通信;
3.关闭Socket;
基于tcp协议模型的框架实现
服务器
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverStringTest {
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
try {
//1.创建ServiceSocket类型的对象并提供端口号
ss = new ServerSocket(8888);
//2.等待客户端的连接请求,调用accept方法
System.out.println("等待客户端的连接请求...");
//没有客户端连接就阻塞在这里
s = ss.accept();
System.out.println("客户端连接成功!");
//3使用输入输出流进行通信
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭Socket并释放资源
if(null!=s) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端
public class ClientStringTest {
public static void main(String[] args) {
Socket s = null;
try {
//1.创建Socket类型的对象并提供服务器的主机名和端口号
s = new Socket("127.0.0.7",8888);
System.out.println("连接服务器成功!");
//2.使用输入输出流进行通信
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭Socket并释放有关资源
if(null != s){
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端向服务器发送数据的实现
服务器端
public class SeverStringTest {
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
BufferedReader br = null;
try {
//1.创建ServiceSocket类型的对象并提供端口号
ss = new ServerSocket(8888);
//2.等待客户端的连接请求,调用accept方法
System.out.println("等待客户端的连接请求...");
//没有客户端连接就阻塞在这里
s = ss.accept();
System.out.println("客户端连接成功!");
//3使用输入输出流进行通信
//实现对客户端发来字符串内容的接受并打印
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String s1 = br.readLine();
System.out.println("从客户端接收到的字符串内容是"+s1);
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭Socket并释放资源
if(null!=br){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null!=s) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端
public class ClientStringTest {
public static void main(String[] args) {
Socket s = null;
PrintStream ps = null;
try {
//1.创建Socket类型的对象并提供服务器的主机名和端口号
s = new Socket("127.0.0.7",8888);
System.out.println("连接服务器成功!");
//2.使用输入输出流进行通信
Thread.sleep(1000);
//实现客户端向服务器发送字符串内容"hello"
ps = new PrintStream(s.getOutputStream());
ps.println("hello");
System.out.println("客户端发送数据成功!");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
} finally {
//3.关闭Socket并释放有关资源
if(null!=ps){
try {
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(null != s){
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}