TCP/IP协议
TCP/IP
- TCP/IP是以TCP和IP为基础不同层次上的多个协议的集合。
- TCP/IP参考模型
- 应用层:应用程序通过这一层访问网络,常见 FTP、HTTP、DNS 和 TELNET 协议;
- 传输层:TCP协议以及UDP协议
- 网络层:IP 协议,ARP、RARP 协议,ICMP 协议等;
- 网络接口层:是TCP/IP的基层,负责数据帧的发送和接收。
- 运作关系
![这里写图片描述](https://img-blog.csdn.net/20161119083707673)
TCP
- Transmission Control Protocol 传输控制协议
IP
IP地址
- 通常是32bit数字组成,以小数点隔开,用十进制表示,如”255.255.255.255”
域名
MAC地址
- MAC地址:又称物理地址、硬件地址。用来确定互联网中硬件的位置。
- TCP/IP协议中的网络层管理IP地址,链路层(网络接口层)用来管理MAC地址。
- 每个网络位置有自己的IP地址
- 每个主机有自己的MAC地址
端口号
- IP地址相当于网络位置,找到位置要进行通信需要知道端口号。IP地址好比是紫禁城,端口就相当于是各个城门,不同的城门由于不同的用处。
- 一个IP地址有2^16个端口号,各自有相应的功能,其中(0~1023)是系统预留,由Internet端口分配机构管理,常见常用端口号如下(1~1023):
- SMTP(简单邮件传输协议)服务器的 TCP 端口号都是 25
- FTP(文件传输协议)服务器的 TCP 端口号都是 21
- TFTP(简单文件传输协议)服务器的 UDP 端口号都是 69
- 其他端口号是用于各种不同的应用进行通信使用的。
封装与分用
- 数据通过协议层每一层会对数据的首部或尾部添加信息。
![这里写图片描述](https://img-blog.csdn.net/20161119093550487)
InetAddress 类
- INetAddress类用于标示网络上的硬件资源,标示互联网协议地址
InetAddress address1 = InetAddress.getLocalHost()
//通过相应的方法获取相应信息
System.out.println("计算机名:"+address1.getHostName())
System.out.println("计算机IP:"+address1.getHostAddress())
byte [] IP = address1.getAddress()
System.out.println("字符数组型IP"+Arrays.toString(IP))
//获取其他机器信息的实例
InetAddress address2 = InetAddress.getByName("Eric.local")
InetAddress address3 = InetAddress.getByName("192.168.1.100")
System.out.println(address2.getHostName())
URL 应用
- 统一资源定位符,表示网络上某一资源的地址。
- URL常用方法
常用方法
// URL 常用方法
URL imooc = new URL("http://www.imooc.com")
// 通过重构方法依据上一个URL创建新的URL
URL url1 = new URL(imooc, "/index.html?username = tom #test")
// ?后面是参数 #后面是锚点
System.out.println("协议是:" + url1.getProtocol())
System.out.println("主机:" + url1.getHost())
System.out.println("端口:" + url1.getPort())
System.out.println("文件名:" + url1.getFile())
System.out.println("文件路径" + url1.getPath())
System.out.println("涉及:" + url1.getRef())
System.out.println("查询字符串:" + url1.getQuery())
获取网页信息
URL url = new URL("http://www.baidu.com");
InputStream in = url.openStream();
InputStreamReader isr = new InputStreamReader(in, "utf-8");
BufferedReader br = new BufferedReader(isr);
String data = br.readLine();
while (data != null) {
System.out.println(data);
data = br.readLine();
}
br.close();
isr.close();
in.close();
}
socket 实现TCP编程
资源路径
UDP 编程
package socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
class UDPServer {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8801);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
System.out.println("服务器端已经启动,等待接受数据");
socket.receive(packet);
String info = new String(data, 0, packet.getLength());
System.out.println(info);
/**
* 向客户端响应数据
*/
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] message = "服务器接收到你的消息了".getBytes();
DatagramPacket packet1 = new DatagramPacket(message , message.length, address, port);
socket.send(packet1);
socket.close();
}
}
package socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Arrays;
public class UDPClient {
public static void main(String[] args) throws IOException {
/**
* 向服务器发送数据
*/
InetAddress address = InetAddress.getByName("localhost");
int port = 8801;
byte [] data = "用户名:admin 密码:1234".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
/**
* 接受服务器返回的数据
*/
byte[] message = new byte[1024];
DatagramPacket packet1 = new DatagramPacket(message, message.length);
socket.receive(packet1);
String info = new String(message, 0, packet1.getLength());
System.out.println(info);
}
}
综合项目