一、定位
(1)通过IP定位主机
InetAddress类:
通过getLocalHost方法可以获得当前主机的对象
InetAddress address = InetAddress.getLocalHost();
通过静态方法getByName()方法可以通过域名获得IP地址
getHostAddress方法可以返回当前对象的IP地址为String类型
例如:InetAddress.getByName(“www.163.com”);
注:不是所有的域名通过getByName方法都能获得IP地址,有些域名不支持DNS解析
(2)通过端口定位软件
端口:0-65535个
同一个协议下的端口不能冲突
一般使用端口 最好在8000以上,如果使用的端口被占用了就会报一场。
构造器
InetSocketAddress(IP|域名,端口)
InetSocketAddress(InetAddress addr, int port) //通过IP和端口构建对象
方法
getAddress 获得 InetAddress //获得IP地址
getPort//获取端口号
(3)通过URL(统一资源定位器)定位网上的资源
// 互联网三大基石 HTTP html url
URL类
构造器
URL(String spec) 从 String表示形成一个 URL对象
方法
getPort//获取端口号
getHost//域名或者IP
getProtocol获取协议
getFile获取资源
getPath获取资源
getQuery获取参数
getRef获取锚点
例如
new URL(“http://www.baidu.com:80/index.html?uname=shsxt&age=18#a”);
协议http
域名|ipwww.baidu.com
端口80
请求资源/index.html?uname=shsxt&age=18
请求资源/index.html
参数uname=shsxt&age=18
锚点a
(4)套接字 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
从所处的地位来讲,套接字上联应用进程,下联网络协议栈,
是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
二、传输协议
(1)TCP(安全)
(2)UDP
三、Socket编程
(1)TCP
①ServerSocket类
②Socket类:该类实现客户端套接字(也称为“套接字”),进行通信的接口。套接字是两台机器之间通讯的端点。
构造器:
Socket() 创建一个未连接的套接字,并使用系统默认类型的SocketImpl。
Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。
Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
服务器端流程:
创建服务器:
1、指定端口 使用ServerSocket创建服务器
ServerSocket server = new ServerSocket(端口号);
2、阻塞式等待连接accept方法 ,该方法返回一个Socket对象
调用acceppt方法等待客户端建立连接
Socket client = server.accept();
客户端则使用 Socket类 创建对象 client指定服务器名称以及端口
Socket client = new Socket(主机名或IP,9999);
3、操作:输入输出流操作
从控制台中获取字符输入
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
发送消息->输出流
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
👆 创建流 👇 操作
console.readLine();//读一行文字,此方法从控制台获取输入,返回类型为String
dos.writeUTF(要发的消息);//此方法用来向对方发送消息
writeUTF()使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流。
输出流都要调用的方法
dos.flush()刷新此数据输出流,这将强制任何缓冲的输出字节写入流。
接收消息->输入流
DataInputStream dis = new DataInputStream(client.getInputStream());
dis.readUTF()//该方法用来接收消息返回类型为String
操作完之后 别忘了释放资源
dis.close()
dos.close()
4、释放资源
client.close();
server.close();
(2)UDP
DatagramSocket类: 此类表示用于发送和接收数据报数据包的套接字。
DatagramPacket类: 该类表示数据报包。
构造方法
发送报文流程:
1、DatagramSocket 指定端口、创建发送端11
DatagramSocket client = new DatagramPacket(指定发送端的端口号);
2、准备数据,数据一定要转成字节数组
String类的方法getBytes可以将字符串转为字节数组
3、封装成DatagramPacket 数据报包
DatagramPacket构造器
DatagramPacket(byte[] buf, int offset, int length)
构造一个 DatagramPacket用于接收长度的分组 length ,指定偏移到缓冲器中。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address,int port)
DatagramPacket(byte[] buf, int offset, int length, InetSocketAddress address)
buf->要发送的字节数组 offset->偏移量 length->字节数组长度
address->指定主机名字或者IP地址
port->指定接收端的端口号
4、发送包裹 通过DatagramSocket类的send(数据包名)方法发送
client.send(packet);
5、释放资源client.close();
接收报文流程:
1、创建接收端
DatagramSocket server = new DatagramSocket(port);port是接收端的端口号
2、准备报文容器 封装成DatagramPacket
byte[] container = new byte[1024*64];//创建接受用的字节数组
DatagramPacket(byte[] buf, int offset, int length)
offset 是缓冲区的偏移量
构造一个 DatagramPacket用于接收长度的分组 length ,指定偏移到缓冲器中
DatagramPacket packet = new DatagramPacket(container,0,container.length);
3、阻塞式接收方法 DatagramSocket类的receive(packet);
server.receive(packet);//返回类型为字节数组
byte[] datas = packet.getBytes();//获得字节数组
String str = new String(datas,0,packet.getLeagth())
5、释放资源
server.close();
四、手写聊天室(小案例)