概念
- 网络:将不同区域的计算机连接到一起,互联网。
- 端口号:类似于电脑房子的房门,2个字节,由于一个字是8位,两个字节是16位,所以2的16次方=65535,端口号从0–65535共65536个。
- 在同一个协议下,端口号不能重复,不同协议下可以重复。
- 1024以下的端口号尽量不要使用,防止有些固定的端口被占用(eg:80–>http,21–>ftp)。
- 资源定位:
- URL:统一资源定位符(L表示Locator)
- URI:统一资源
- 数据的传输
- TCP协议与UDP协议TCP协议与UDP协议:
- TCP(Transfer Control protocol):传输控制协议,电话 类似于三次握手 面向连接 点到点 安全可靠 效率相对低下(必须等待连接)
- UDP(User Datagram Protocol):用户数据包协议,短信 非面向连接 效率高 安全性低 数据可能丢失(只管往外发)
- 传输:先封装,后拆封。
- Java网络编程相关类
- InetAddress InetSocketAddress
- URL
- TCP:ServerSocket Socket
- UDP:DatagramSocket DatagramPacket
InetAddress
- 封装计算机的IP地址和DNS,没有封装端口。
- 方法代码举例:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetDemo01 {
public static void main(String[] args) throws UnknownHostException {
//使用getLocalHost方法创建InetAddress对象
InetAddress addr=InetAddress.getLocalHost();
System.out.println(addr.getHostAddress());//显示本机ip地址
System.out.println(addr.getHostName());//显示计算机名
//根据域名得到InetAddress对象
InetAddress addr01=InetAddress.getByName("www.163.com");
System.out.println(addr01.getHostAddress());//返回163服务器的ip地址
System.out.println(addr01.getHostName());//显示域名
//根据ip得到InetAddress对象
InetAddress addr02=InetAddress.getByName("219.147.92.64");
System.out.println(addr02.getHostAddress());//返回163服务器的ip地址
System.out.println(addr02.getHostName());//如果域名存在且允许解析,则返回域名,否则返回ip地址
}
}
InetSocketAddress
- 封装计算机的IP地址、DNS和端口。
- 创建对象
- InetSocketAddress(String hostname, int port)
- InetSocketAddress(InetAddress addr,int port)
- 方法
- getAddress()
- getHostName()
- getPort()
代码举例:
import java.net.InetAddress;
import java.net.InetSocketAddress;
//在InetAddress的基础上,封装了端口
public class InetSocketDemo01 {
public static void main(String[] args) {
InetSocketAddress address=new InetSocketAddress("127.0.0.1",9999);
System.out.println(address.getHostName());
System.out.println(address.getPort());
System.out.println(address.getAddress());
InetAddress addr=address.getAddress();
System.out.println(addr.getHostAddress());//显示本机ip地址
System.out.println(addr.getHostName());//显示计算机名
}
}
URL
- URI(Uniform Resource Identifier)统一资源标识符,用来唯一的标识一个资源。
- URL(Uniform Resource Locator)统一资源定位器,指向互联网资源的指针,它是一种具体的URI
- 统一资源定位符由4部分组成:协议(http协议等)、存放资源的主机域名、端口号(http协议的服务器默认端口是80)和资源文件名。
- eg:http(协议): / /www.baidu.com(存放资源的主机域名) :80(端口号)/index.xxx(资源文件名)
- 创建对象
- URL(String spec):绝对路径构建
- URL(URL context,String spec):相对路径构建
- 方法代码举例:
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
public static void main(String[] args) throws MalformedURLException {
//绝对路径构建
URL url=new URL("http://www.baidu.com:80/index.html#aa?uname=test");
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());//?参数:存在锚点(#aa) 返回null,不存在,返回正确
//相对路径构建
URL url1=new URL("http://www.baidu.com:80/a");
URL url2=new URL(url1,"b.txt");
}
}
UDP通信
- 以数据为中心,非面向连接,不安全,数据可能丢失,效率高
- 类DatagramSocket DatagramPacket
- 客户端:
- 创建DatagramSocket类(创建客户端)+ 指定端口
- 准备数据 字节数组
- 打包 DatagramPacket + 服务器的地址及端口
- 发送
- 释放资源
- 代码举例
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
//客户端
public class MyClient {
public static void main(String[] args) throws IOException {
//1创建客户端+端口
DatagramSocket client=new DatagramSocket(6666);
String msg="udp编程";
//2将字符数据转化为字节数据储存
byte[]data=msg.getBytes();
//3打包(发送的地点及端口)
//DatagramPacket(byte[],int(偏移量),int,SocketAddress)
DatagramPacket packet=new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
//4发送
client.send(packet);
//5释放
client.close();
}
}
- 服务器端
- 创建服务端 DatagramSocket类+指定端口
- 准备接收容器 字节数组 封装 DatagramPacket
- 包 接收数据
- 分析
- 释放资源
- 代码举例
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//服务端
public class MyServer {
public static void main(String[] args) throws IOException {
//1、创建服务端+端口
DatagramSocket server=new DatagramSocket(8888);
//2、准备接收容器
byte[] container=new byte[1024];
//3、将容器打包,封装成包
DatagramPacket packet=new DatagramPacket(container,container.length);
//4、接收数据,将数据接收到包packet中
server.receive(packet);
//5、分析数据
byte[]data=packet.getData();
int len=packet.getLength();
System.out.println(new String(data,0,len));
//6、释放
server.close();
//运行之后就开始在等待
}
}
Socket通信
- 基于TCP:面向连接,安全可靠,效率低,类似于打电话
- 面向连接:请求-响应(Request-Response)
- Socket编程
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket server = new ServerSocket(8888);
//接收客户端连接 阻塞式(不接收,不继续)
Socket socket=server.accept();
System.out.println("一个客户建立连接!");
//发送数据
String msg="欢迎使用!";
//输出流!!!
BufferedWriter bw=new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream()));
bw.write(msg);
bw.newLine();//结束当前行
bw.flush();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//创建客户端(指定服务器+端口) 就在此时连接
Socket client=new Socket("localhost",8888);
//接收数据 输入流!!!
BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream()));
String echo=br.readLine();//阻塞式 发送的服务器端需要结束当前行
System.out.println(echo);
}
}