IP 位置
( IP) 是 Internet Protocol 的外语缩写, 网络之间互连的协议也就是为计算机网
络相互连接进行通信而设计的协议。 在因特网中,它是能使连接到网上的所有计算机网络
实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家
生产的计算机系统,只要遵守 IP 协议就可以与因特网互连互通。
端口:区分数据流向的软件 0-65535 不要使用 1024 以下的端口 ,每一个协议拥有
自己的端口,在同一个协议下端口不能重复 FTP:21 HTTP:80
端口
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机
上运行多个网络应用程序。可以类比为:IP 相当于公司,端口相当于公司各部门,URL,相当
于各部门的人员
包含端口,用于 socket 通信的
1) 、获取对象
InetSocketAddress(String hostname, int port)
InetSocketAddress(InetAddress addr, int port)
2) 、方法
getAddress() 返回 InetAddress 对象
getPort() 返回端口
getHostName() 返回域名
url
URL 全称是 Uniform Resource Location,也就是统一资源位置。实际上,URL 就是
一种特殊的 URI,它除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以
通过它来获取 URL 对应的资源。
URL 所表示的网络资源位置通常包括用于访问服务器的协议(如 http、ftp 等)、服务器
的主机名或者 IP 地址、以及资源文件在该服务器上的路径。典型的 URL 例如
http://localhost/myProject/index.html
URL 的语法表示形式为:
protocol://userInfo@host:port/path?query#fragment
协议://用户信息@主机名:端口/路径?查询#锚点
java.net.URL 类(后面直接叫 URL)是 JDK 对 URL 的统一抽象,它是一个 final 修饰的
类,也就是不允许派生子类。
传输层协议
1. 协议
TCP:TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低
UDP:UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、
效率高
2. UDP 编程: DatagramSocket DatagramPacket
UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息
传送服务。其特点为:非面向连接;传输不可靠;数据可能丢失。
1)、服务器:
①创建服务器 DatagramSocket 类 +指定端口
②准备接收容器 字节数组 +封装成 DatagramPacket 数据包
③接收数据
④分析数据
⑤释放资源
package day16.net03;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
* UDP实现基本流程: 接收端
* 1.构建接收端
* 2.准备包裹-->用来接收数据
* 3.接收
* 4.处理数据
* 5.关闭
*/
public class UDPReceive02 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是接收端-----------------------------------");
//1.构建接收端
DatagramSocket receive = new DatagramSocket(8888);
//2.准备包裹-->用来接收数据
byte[] arr = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(arr,arr.length);
//3.接收
receive.receive(packet);
//4.处理数据
/*
* byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
*/
byte[] result = packet.getData();
int length = packet.getLength();
System.out.println(new String(result,0,length));
FileOutputStream fileOutputStream =new FileOutputStream("D:\\IdeaProjects\\test\\src\\day16\\net03\\R.txt");
fileOutputStream.write(result);
//5.关闭
fileOutputStream.close();
receive.close();
}
}
2)、客户端:
①创建客户端 DatagramSocket 类 +指定端口
②准备数据 字节数组
③封装成数据包 需要指定包发送的地址+端口 即服务器地与端口
④发送数据
⑤释放资源
package day16.net03;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.*;
/*
* 传输层协议: 合同
* UDP: 写信 发短信 非面向连接 不安全 只管写只管发送->效率高 协议简单,开销小 大小有限制一般不超过60k --> 发送端和接受端两端平等 --> 字节数组
* TCP: 打电话 面向连接 安全 基于3次握手-> 1)你在么? 2)在呢 ,建立连接 3)传输 --> 客户端 服务器端
*
* Socket 套接字
* 相当于传输层为应用层开辟的一个小口子
* 不同协议下Socket实现不同
* 面向Socket编程
*
* DatagramSocket
* DatagramPacket
*
* UDP实现基本流程: 发送端
* 1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
* 2.准备数据--> 转为字节数组
* 3.打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。
* 4.发送数据 send(DatagramPacket p) 从这个套接字发送一个数据报包。
* 5.关闭
*
*---文件的传输---> 从本地文件中 读取数据-->传输到对方-->接收到数据-->写出指定本地位置
*/
public class UDPSend01 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是发送端-----------------------------------");
//1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
//InetSocketAddress inetSocketAddress = new InetSocketAddress();
File file = new File("D:\\IdeaProjects\\test\\src\\day16\\net03\\text.txt");
FileInputStream fileInputStream = new FileInputStream(file);
DatagramSocket send = new DatagramSocket(7777);
//2.数据
byte[] b = new byte[1024];
//用来接收每次读到的字节数量;
fileInputStream.read(b);
// int len = -1;
//read(byte[]) 读取一定数量的字节也就是参数设置的大小 放到缓存区 返回每次读取的字节数量 read() 返回每次读取到的字节;
// while ((len=fileInputStream.read(b))!=-1){
// //将缓存区的字节输出到目标文件 因为文件末尾读到的字节数不确定所以 每次输出缓存区的 0 到 实际读到的字节长度;
//
// }
//3.打包
DatagramPacket packet = new DatagramPacket(b,0,b.length,new InetSocketAddress("192.168.14.135", 8888));
//4.发送
send.send(packet);
//5.关闭
fileInputStream.close();
send.close();
}
}
TCP 编程:ServerSocket Socket
transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输
层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),
类似于拨打电话
1.特点
基于 tcp 协议,建立稳定连接的点对点的通信;实时、快速、安全性高、占用系统资源
多、效率低;“请求-响应”模式:
a)、客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序
b)、服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序
• Socket:发送 TCP 消息
• ServerSocket:创建服务器
套接字是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通过网
络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而
一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。
一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点
关闭连接
2. 服务器:
①创建服务器 指定端口
②等待客户端连接
③分析接收数据
package day16.net03;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/* tcp基于IO流操作
* TCP 基本流程: 服务端
* 1.创建服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。 服务端的端口号
* 2.阻塞式监听
* 3.获取IO流
* 4.读入数据
* 5.操作数据
* 6.关闭
*/
public class TCPServer04 {
public static void main(String[] args) throws IOException {
System.out.println("---------------Server--------------");
//1.创建服务端
ServerSocket server = new ServerSocket(8888);
//2.阻塞式监听
Socket client = server.accept();
System.out.println("-----------有一个客户端连接成功-------------------");
//3.获取IO流
InputStream is = client.getInputStream();
//4.读入数据
byte[] car = new byte[1024];
//把数据读入到字节数组car中,返回值len为读入到字节数组中真实数据的长度
int len = is.read(car);
//5.操作数据
System.out.println(new String(car,0,len).equals("laopei"));
//6.关闭
is.close();
client.close();
server.close();
}
}
3. 客户端:
①连接服务器: 创建客户端 +指定服务器地址 +端口
②发送数据
package day16.net03;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/* tcp基于IO流操作
* TCP 基本流程: 客户端
* 1.创建客户端 Socket(String host, int port) 指定服务端的IP+端口
* 2.获取IO流
* 3.写出数据
* 4.关闭
*
* --------------登录: 客户端向服务器传输用户名和密码的值,服务端接受到数据进行数据校验(用户名=laopei,密码=0523),校验结果服务端直接打印就可以-------------------
*/
public class TCPClient03 {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("---------------client--------------");
//1.创建客户端
Socket client = new Socket("127.0.0.1",8888);
//2.获取输入流
OutputStream is = client.getOutputStream();
//3.写出数据
is.write("zhangsan".getBytes());
//4.关闭
is.close();
client.close();
}
}