一、网络常识
1、什么是计算机网络
- 分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统
- 计算机网络,可以很方便的进行信息的传递,资源的共享 !
2、 什么是计算机的IP地址
IP
地址 是计算机在互联网中的唯一标识 ,
就像人在社会中的身份证号码。
本机
IP: 127.0.0.1 localhost
3、什么是 网络中网站的域名
域名可以简单的理解为
,IP
地址的别名
.
更方便记忆
,
当输入域名后
(
例如
www.baidu.com) ,
计算机会访问域名解析商 ,
然后得到
ip
地址,
再进行访问。
4、什么是计算机的端口号
- 端口号的范围 0-65535 之间。
- 与ip地址很相似, IP地址是计算机在网络中的唯一标识。
- 端口号是计算机中程序的标识 ,用于在一台计算机中区分不同的应用程序。
- 端口号在使用时 , 应尽量避免0-1024之间的端口号, 因为已经被一些知名的软件和 windows操作系统所占用了。
5、什么是计算机之间的通信协议
- 是计算机与计算机之间交流的标准。
- 是对数据的传输速率,传入接口,步骤控制,出错控制等等制定的一套标准 !
- 常用的通信协议:
- http协议 : 超文本传输协议 80端口号
- https协议: 安全的超文本传输协议 443端口号
- ftp协议: 文件传输协议 21端口号
- TCP协议: 传输控制协议
- UDP协议: 数据报协议
二、网络编程程序的分类
1.B/S 程序 : 浏览器与服务器程序
2.C/S 程序 : 客户端与服务器程序
三、TCP协议 - OSI网络模型
指的是从一台计算机的软件中
,
将数据发送到另一台计算机的软件中的过程。
七层网络模型:
应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层
四、三次握手和四次挥手
- tcp协议客户端与服务器连接时, 存在三次握手操作, 确保消息能准确无误的发送。
- 断开连接是时 , 存在四次挥手操作。
五、TCP的CS程序
需要使用到两个类
,
来编写
TCP
协议的
CS
程序
.
- ServerSocket 搭建服务器
- Socket 搭建客户端
两方使用
socket(
套接字
,
通信端点
)
进行交流。
六、ServerSocket
- 用于创建服务器 . 创建完毕后, 会绑定一个端口号。
- 然后此服务器可以等待客户端连接。
- 每连接一个客户端 , 服务器就会得到一个新的Socket对象, 用于跟客户端进行通信 。
1、常用构造方法
ServerSocket(int port);
- 创建一个基于TCP/IP协议的服务器 , 并绑定指定的端口号.
- 注意: 参数port的范围是: 0-65535 (建议1025-65535)
2、常用方法
Socket accept();
- 等待客户端连接。
- 此方法会导致线程的阻塞!
- 直到一个新的客户端连接成功,return Socket对象后, 线程在继续执行。
void close();
- 释放占用的端口号 , 关闭服务器。
七、Socket
是两台计算机之间通信的端点 , 是网络驱动提供给应用程序编程的一种接口一套标准, 一种机制。
1、构造方法
Socket(String ip,int port)
- 创建一个套接字, 并连接指定ip和端口号的服务器.
- 参数1. 服务器的ip地址
- 参数2. 服务器软件的端口号
2、常用方法
- OutputStream getOutputStream();
返回的是
,
指向通信的另一端点的输出流
- InputStream getInputStream();
返回的是
,
指向通信的另一端点的输入流
- void close();
关闭套接字
注意
:
- 在网络编程时,获取输入输出流的操作,对于客户端与服务器来说是相对的
- 客户端的输入流,输入的是服务器的输出流输出的内容
- 客户端的输出流,输出到了服务器的输入流中
- 所以在使用时, 需要注意以下一点规则:
- 客户端与服务器获取流的顺序必须是相反的。
- 例如:
- 客户端先得到了输入流 ,那服务器必须先获取输出流
八、案例echo程序
客户端:
//1.连接服务器
Socket socket = new Socket ("192.168.102.228",8888);
//2.得到输出流
//2.1得到输出流
OutputStream os = socket.getOutputStream();
//2.2将输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
//3.得到输入流
//3.1得到输入流
InputStream is = socket.getInputStream();
//3.2将字节输入流,转换为字符输入流,并转换为逐行读取流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//4.循环接收用户输入
Scanner input = new Scanner(System.in);
while(true)
System.out.println("请输入要发送给服务器的内容:");
String text1 = input.nextLine();
//5.将用户输入的内容,发送给服务器
ps.println(text1);
//6.接收服务器回复的消息
String text2 = br.readLine();
System.out.println(text2);
if("886".equals(text1)) {
break;
}
}
服务器端:
public static void main(String[] args) throws Exception {
//1.启动服务器,并侦听8888端口号
ServerSocket server = new ServerSocket(8888);
//2.打印提示
System.out.println("服务器已启动,等待客户端连接中... ");
//3.等待客户端连接
Socket socket = server.accept();
System.out.println("一个客户端连接成功: " +socket.getInetAddress().toString());
//4.获取输入流
//4.1获取输入流
InputStream is = socket.getInputStream();
//4.2将输入的字节流 ,转换为字符流
InputStreamReader isr = new InputStreamReader(is);
//4.3将字符流, 转换为逐行读取流
BufferedReader br = new BufferedReader(isr);
//5.获取输出流
//5.1获取输出流
OutputStream os = socket.getoutputStream();
//5.2将字节输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
while(true) {
//6.循环读取一行行的数据, 读取操作会导致线程的阻塞,直到客户端真的发送了数据,
/ /服务器才能接到,顺序继续执行下面的代码
String text = br.readLine();
//7.将这个文字,再打印给客户端
ps.print1n( "服务器:"+text);
if("886".equals(text)) {
break;
}
}
}