IP地址(Internet Protocol)
唯一标识网络上的每一台计算机
IP地址的组成
32位,由4个8位二进制数组成
IP地址 = 网络地址 +主机地址
网络地址:标识计算机或网络设备所在的网段
主机地址:标识特定主机或网络设备
查看IP地址,检测网络是否畅通
查看本机的IP地址
ipconfig
测试网络是否通畅
ping 目标IP地址
网络服务器
通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机
网络通信协议
为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
物理层/数据链路层 由底层网络定义的协议
网络层 ICMP,IGMP,IP,ARP,RARP
传输层 TCP.UDP
应用层 HTTP,FTP,TFTP,SMTP,SNMP,DNS
TCP协议(Transmission Control Protocol 传输控制协议)
面向连接的、可靠的、基于字节流的传输通信协议。
UDP协议(User Datagram Protocol 用户数据报协议)
无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接
什么是Socket?
通信链路的端点就被称为“套接字”(英文名Socket)
Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的
- 某公司使用一台路由器,将公司的50台电脑连接在一起,构成是(局域网);
网络中有一台主机,IP地址是210.10.8.1,他的网络ID是(210.10.8).这是C类网,网络ID是前三个数字。
使用Socket开发而无需了解底层机制
java.net包
Socket
ServerSocket 服务器
DatagramPacket
DatagramSocket
InetAddress
……
基于TCP协议的Socket网络通信:
用来实现双向安全连接网络通信
Socket通信模型
进行网络通信时,Socket需要借助数据流来完成数据的传递工作
Socket网络编程一般可以分成如下步骤进行:
建立连接
打开Socket关联的输入输出流socket inputStream ouputStream
流中读写信息read() write()
关闭所有的数据流和Socket
如何传递对象信息呢?
ObjectOutputStream oos = new ObjectOutputStream(…);
oos.writeObject(…);
ObjectInputStream ois = new ObjectInputStream(…);
Object = ois.readObject();
如何实现多客户请求呢?
采用多线程的方式
一个专门负责监听的应用主服务程序
一个专门负责处理请求的线程程序
TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
速度 慢 快
DatagramPacket类
封装了数据报的数据、数据长度、目标地址和目标端口
DatagramSocket类
接收和发送DatagramPacket对象封装好的数据报
基于UDP协议的Socket网络编程步骤:
利用 DatagramPacket 对象封装数据报
利用 DatagramSocket 发送数据报
利用 DatagramSocket 接收数据报
利用 DatagramPacket 处理数据报
判断对错
DatagramPacket类提供用于发送或接收数据的方法
基于UDP协议的通信与基于TCP协议的通信相比,不如后者可靠
Socket分类
- 流式套接字:面向连接、可靠的数据传输服务
- 数据报式套接字:无连接服务
- 原始式套接字
Socket---LoginClient: 客户端!
/*
客户端
发送请求到服务器
创建一个客户端的Socket
先半关闭输出流
通过输入流接收服务器给我的响应
释放资源
*/
public class LoginClient {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
// 创建一个客户端的Socket
Socket socket = new Socket("localhost", 5000);
System.out.println("客户端已启动");
// 通过输出流发送请求
System.out.println("输入:");
String str = input.next();
OutputStream os = socket.getOutputStream();
byte[] bytes = str.getBytes();
os.write(bytes);// 向服务器发送消息
socket.shutdownOutput();
// 通过输入流接收服务器给我的响应
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply;
while ((reply = br.readLine()) != null) {
System.out.println("服务器说:" + reply);
}
// 释放资源
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket---LoginServer 服务器!
//服务器
/*
//接收客户端请求
1、创建一个服务器Socket
2、使用accept()侦听,并接收到ServerSocket的连接---获得用户的请求, 此时是在堵塞等待
3、获得输入流,获得用户的请求
4、封装字符流,变成一个缓冲流
//给客户端一个相应
//通过输出流将响应发回给客户端
5、释放相应资源*/
public class LoginServer {
public static void main(String[] args) {
try {
System.out.println("启动服务器");
// 创建一个 Socket
ServerSocket serverSocket = new ServerSocket(5000);
// 使用accept()倾听并收到此ServerSocket的连接
Socket socket = serverSocket.accept();
System.out.println("已连接");
// 获得输入流,获得用户的请求
InputStream is = socket.getInputStream();
//封装了InputStream is,
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;
while ((info = br.readLine()) != null) {
System.out.println("客户端说:" + info);
}
// 给客户端一个响应
String reply = "欢迎登陆";
// 通过输出流将响应发送回客户端
OutputStream os = socket.getOutputStream();
os.write(reply.getBytes());
// 释放相应资源
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}}}