IP协议
IP协议:
Internet是由无数台计算机互相连接而成的。而我们要确认网络上的每一台计算机,靠的就是能唯一标识该计算机的网络地址,
这个地址就叫做IP(Internet Protocol的简写)地址,即用Internet协议语言表示的地址。IP的存储是使用二进制存储。
端口:同一台计算机进程的标识。
端口范围:
0~65535是我们可以使用的端口范围。
0~1024 一般是系统进程端口,不建议使用。
1024~65535 是我们可以使用使用的端口。
注:尽量不要和系统进程或者和已经打开的程序端口重复,否则会出现端口被占用的问题。
协议就是不同计算机通信的规则。
HTTP: 超文本传输协议。同时HTTP 是无处状态,无连接的,非常灵活快速简单的协议。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP允
许传输任意类型的数据对象。无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面
的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。无连接的含义是限制每次连接只处理一个请求
,服务器处理完客户的请求,并收到客户的应答后马上断开连接。采用这种方式可以节省传输时间。
FTP:文件传输协议。
FTP的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。
FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以用
FTP客户端通过FTP协议访问位于FTP服务器上的资源。
TCP:传输控制协议。
TCP主要面向连接的协议,一般都是用来文件上传、文件下载。数据传输量没有限制,并且数据安全可靠。
缺点:就是速度比较慢。
UDP:用户数据报协议。
UDP主要面向无连接,一般是用来发短信、群聊等。UDP的数据传输量有限制,最好不要超过64K,但是UDP传输数据速度快。
缺点:数据不安全,很容易丢失。传输数据之前必须打包处理
IP分为网络区段号和主机段号:
IP地址分类
A类地址: 第一段为网络区段号,后面三段为主机段号 256 * 256 * 256 = 16777216 国家 政府 军方
B类地址: 前两段为网络区段号,后面两段为主机段号 256 * 256 = 65536 学校 公司
C类地址: 前三段为网络区段号,后面一段为主机段号 256 家用 网吧
特殊地址:
127.0.0.1 : 本机地址/回环地址 == localhost == 192.168.1.112
192.168.x.x : 表示私有地址 (这个地址不能够在互联网上使用,只能够在局域网中使用)
x.x.x.25: 表示广播地址
掌握2个命令:
ipconfig: 查看本机网络配置
ping ip地址: 测试是否能够和目标ip进行正常的发送和接收数据包
下面是Java类 InetAddress方法示例:
public class IpDemo {
public static void main(String[] args) throws UnknownHostException {
byte[] bys = {(byte) 192,(byte) 168,1,118};
InetAddress ip = InetAddress.getByAddress(bys);
System.out.println(ip);
System.out.println(InetAddress.getByName("192.168.1.118"));
System.out.println(InetAddress.getByName("www.xxx.com"));
System.out.println(InetAddress.getLocalHost());
System.out.println(InetAddress.getLoopbackAddress());
InetAddress address = InetAddress.getByName("本地主机");
System.out.println(address.getHostAddress());
System.out.println(address.getHostName());
System.out.println(address.isLoopbackAddress());
System.out.println(ip.getHostName());
System.out.println(ip.getHostAddress());
}
}
下面是一个模拟客户端发送数据到服务器端的示例代码:
package com.sxx.cn;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class KeHuDuan {
//客户端示例
public static void main(String[] args) throws IOException {
//创建IP对象
InetAddress ia = InetAddress.getByName("192.168.1.118");
int clientPort = 10001;
//使用 DatagramSocket方法 创建Socket对象
DatagramSocket ds = new DatagramSocket(clientPort,ia);
//创建你发送的数据
String data = "啊!西湖的水我的泪!啊啊~";
//打包数据
byte[] b = data.getBytes();
int length = b.length;
//发送地址
InetAddress sIp = InetAddress.getByName("192.168.1.118");
int s = 1818;
DatagramPacket dp = new DatagramPacket(b, length, sIp, s);
//调研socket 的方法发送数据包
ds.send(dp);
//因为是IO流所以需要释放资源
ds.close();
}
}
服务器端示例:
package com.sxx.cn;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class DomeServer {
public static void main(String[] args) throws Exception {
//使用 DatagramSocket方法创建Socket接收对象
DatagramSocket ds = new DatagramSocket(1818, InetAddress.getByName("192.168.1.118"));
//创建一个空数组来进行拆箱
byte[] buf = new byte[150];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
//进行解析
byte[] data = dp.getData();
String clientIp = dp.getAddress().getHostAddress();
int clientport = dp.getPort();
int length = dp.getLength();
String result = new String(data, 0, length);
System.out.println("来自:" + clientIp + "端口号:" + clientport + "的数据:" + result);
//释放资源
ds.close();
}
}