概念
1、网络:将不同区域的计算机连接到一起 局域网 城域网 互联网
2、地址:IP地址 确定网络上 一个绝对地址 |位置 --->房子的地址
3、端口号: 区分计算机软件的 -->房子的房门 2个字节 0-65535 共65536个
(1) 在同一个协议下 端口号不能重复 不同协议下可以重复
(2) 1024以下的不要使用 80-->http 21 -->ftp
4、资源定位: URL 统一资源定位符 URI :统一资源
5、数据的传输
(1) 协议: Tcp 和UDP协议
1)、TCP(transfer control protocol): 电话 类似于三次握手 面向连接 安全可靠 效率低下
2)、UDP(UserDatagramProtocol ): 短信 非面向连接 效率高
(2) 传输:
1)、先封装
2)、后拆封
地址及端口
1、InetAddress :封装 IP 及DNS
方法:
getHostAddress() 返回ip地址
getHostName() 返回域名|本机为计算机名
InetAddress.getLocalHost();
InetAddress.getByName("ip地址|域名");
2、InetSocketAddress:封装端口
(1) 创建对象:
InetSocketAddress(String hostname, int port)
InetSocketAddress(InetAddress addr, int port)
(2) 方法:
getAddress()
getHostName()
getPort()
/**
* 没有封装端口
* @author FeiEr
*
*/
public class InetDemo01 {
public static void main(String[] args) throws UnknownHostException{
//使用getLocalHost方法创建InetAddress对象
InetAddress addr = InetAddress.getLocalHost();
System.out.println(addr.getHostAddress()); //返回:192.168.1.100
System.out.println(addr.getHostName()); //输出计算机名
//根据域名得到InetAddress对象
addr = InetAddress.getByName("www.163.com");
System.out.println(addr.getHostAddress()); //返回 163服务器的ip:61.135.253.15
System.out.println(addr.getHostName()); //输出:www.163.com
//根据ip得到InetAddress对象
addr = InetAddress.getByName("61.135.253.15");
System.out.println(addr.getHostAddress()); //返回 163服务器的ip:61.135.253.15
System.out.println(addr.getHostName()); //输出ip而不是域名。如果这个IP地 址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。
}
}
/**
* 封装端口:在InetAddress基础上+端口
* @author FeiEr
*
*/
public class InetSockeDemo01 {
public static void main(String[] args) throws UnknownHostException {
InetSocketAddress address = new InetSocketAddress("127.0.0.1",9999);
address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"),9999);
System.out.println(address.getHostName());
System.out.println(address.getPort());
InetAddress addr =address.getAddress();
System.out.println(addr.getHostAddress()); //返回:地址
System.out.println(addr.getHostName()); //输出计算机名
}
}
URL
URI(Uniform resource identifier)统一资源标识符,用来唯一的标识一个资源。
URL(Uniform Resource Locator)统一资源定位器,它是一种具体的URI
四部分组成: 协议 存放资源的主机域名 端口 资源文件名(/)
1、创建
URL(String spec) :绝对路径构建
URL(URL context, String spec) :相对路径构建
2、方法
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("相对路径:"+url.getPath());
System.out.println("锚点:"+url.getRef()); //锚点
System.out.println("参数:"+url.getQuery());//?参数 :存在锚点 返回null ,不存在,返回正确
3、流
openStream()
/**
*
* @author FeiEr
*/
public class URLDemo01 {
public static void main(String[] args) throws MalformedURLException {
//绝对路径构建
URL url = new URL("http://www.baidu.com:80/index.html?uname=bjsxt");
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile());
System.out.println("相对路径:"+url.getPath());
System.out.println("锚点:"+url.getRef()); //锚点
System.out.println("参数:"+url.getQuery());//?参数 :存在锚点 返回null ,不存在,返回正确
url = new URL("http://www.baidu.com:80/a/");
url = new URL(url,"b.txt"); //相对路径
System.out.println(url.toString());
}
}
UDP通信
UDP:以数据为中心 非面向连接 不安全 数据可能丢失 效率高
1、类 DatagramSocket DatagramPacket
客户端:
(1) 创建客户端 DatagramSocket 类 +指定端口
(2) 准备数据 字节数组
(3) 打包 DatagramPacket +服务器地址 及端口
(4) 发送
(5) 释放资源
/**
*
* @author FeiEr
*/
public class Client {
public static void main(String[] args) throws IOException {
//1、创建客户端 +端口
DatagramSocket client = new DatagramSocket(6666);
//2、准备数据
double num =89.12;
byte[] data =convert(num);
//3、打包(发送的地点 及端口) DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket packet = new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
//4、发送
client.send(packet);
//5、释放
client.close();
}
/**
* 字节数组 数据源 +Data 输出流
*/
public static byte[] convert(double num) throws IOException{
byte[] data =null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos =new DataOutputStream(bos);
dos.writeDouble(num);
dos.flush();
//获取数据
data = bos.toByteArray();
dos.close();
return data;
}
}
2、服务器端:(1) 创建服务端 DatagramSocket 类 +指定端口
(2) 准备接收容器 字节数组
(3) 封装 DatagramPacket
(4) 包-->接收数据
(5) 分析数据
(6) 释放资源
/**
*
* @author FeiEr
*/
public class Server {
public static void main(String[] args) throws IOException {
//1、创建服务端 +端口
DatagramSocket server = new DatagramSocket(8888);
//2、准备接受容器
byte[] container = new byte[1024];
//3、封装成 包 DatagramPacket(byte[] buf, int length)
DatagramPacket packet =new DatagramPacket(container, container.length) ;
//4、接受数据
server.receive(packet);
//5、分析数据
double data =convert(packet.getData());
System.out.println(data);
//6、释放
server.close();
}
/**
* 字节数组 +Data 输入流
*/
public static double convert(byte[] data) throws IOException{
DataInputStream dis =new DataInputStream(new ByteArrayInputStream(data));
double num =dis.readDouble();
dis.close();
return num;
}
}
Socket通信
基于tcp: 面向连接 安全 可靠 效率低 ,类似于打电话
1、面向连接: 请求-相应 Request --Response
2、Socket编程
服务器: ServerSocket
/**
* 必须先启动服务器 后连接
* 1、创建服务器 指定端口 ServerSocket(int port)
* 2、接收客户端连接
* 3、发送数据+接收数据
* @author FeiEr
*
*/
public class Server {
public static void main(String[] args) throws IOException {
//1、创建服务器 指定端口 ServerSocket(int port)
ServerSocket server = new ServerSocket(8888);
//2、接收客户端连接 阻塞式
Socket socket =server.accept();
System.out.println("一个客户端建立连接");
//3、发送数据
String msg ="欢迎使用";
//输出流
/*
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream()));
bw.write(msg);
bw.newLine();
bw.flush();
*/
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(msg);
dos.flush();
}
}
客户端: Socket
/**
* 1、创建客户端 必须指定服务器+端口 此时就在连接
* Socket(String host, int port)
* 2、接收数据 +发送数据
* @author FeiEr
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//1、创建客户端 必须指定服务器+端口 此时就在连接
Socket client = new Socket("localhost",8888);
//2、接收数据
/*
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String echo =br.readLine(); //阻塞式方法
System.out.println(echo);
*/
DataInputStream dis = new DataInputStream(client.getInputStream());
String echo = dis.readUTF();
System.out.println(echo);
}
}