package cn.tedu.net.address;
import java.net.InetSocketAddress;
public class InetSocketAddressDemo {
public static void main(String[] args) {
//创建代表IP地址和端口的对象
//localhost解析成127.0.0.1永远只想本地
InetSocketAddress is=new
InetSocketAddress("localhost",8080);
//获取信息
//获取IP地址
System.out.println(is.getAddress());
//获取主机名
System.out.println(is.getHostName());
}
}
底层基于流,传输不建立连接,不安全(不可靠)但是速度快
底层根据数据包(64KB)来进行数据传输
适用场景:直播、视频、音频等等
DatagramSocket、DatagramPacket
package cn.tedu.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPSenderDemo {
//创建UDP发送端的对象
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket();
//创建数据包的对象---准备发送数据
//第一个参数代表发送的数据
//第二个参数代表实际发送数据内容长度
//第三个参数代表IP地址和端口号
DatagramPacket dp=new DatagramPacket
("早上好".getBytes(),"早上好".getBytes().length,
new InetSocketAddress("127.0.0.1",8081));
//发送数据包
ds.send(dp);
//关流
ds.close();
}
}
发送端
1.创建UDP发送端对象
2.创建数据包(指定IP地址、端口号以及要发送数据)
3.发送数据包
4.关流
package cn.tedu.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;
public class UDPChatDemo {
public static void main(String[] args) {
//创建线程对象开启线程
new Thread(new Sender()).start();
new Thread(new Receiver()).start();
}
}
//定义类---代表线程执行任务信息(发送端)
class Sender implements Runnable{
//发送过程
@Override
public void run() {
try {
//创建发送端对象
DatagramSocket ds=new DatagramSocket();
//创建Scanner类对象
Scanner sc=new Scanner(System.in);
//保证可以一直发送数据
while (true){
//准备发送数据
byte[] bs=sc.nextLine().getBytes();
//创建数据包
DatagramPacket dp=new DatagramPacket(bs,bs.length,
new InetSocketAddress("255.255.255.255",9090));
//发送数据包
ds.send(dp);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
//定义类---代表线程执行任务信息(接收端)
class Receiver implements Runnable{
//指定接收过程
@Override
public void run() {
try {
//创建UDP接收端对象---监听端口号
DatagramSocket ds=new DatagramSocket(9090);
//创建接收数据的数据包对象
DatagramPacket dp=new DatagramPacket
(new byte[1024],1024);
//保证可以一直接收数据
while (true){
//接收发送端发送数据
ds.receive(dp);//会让线程阻塞状态
//解析数据包
System.out.println(dp.getAddress());
System.out.println
(new String(dp.getData(),0,dp.getLength()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收端
1.创建UDP接收端对象,监听端口号
2.创建数据包(接收发送端发送数据)
3.接收数据包
4.关流
5.解析数据包
package cn.tedu.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceiverDemo {
public static void main(String[] args) throws IOException {
//创建UDP接受端的对象---监听发送端的端口号
DatagramSocket ds=new DatagramSocket(8081);
//创建数据包对象---接收数据
//第一个参数代表来接受数据的字节数组
//第二个参数代表真实的接收数据内容长度
DatagramPacket dp=new DatagramPacket
(new byte[1024],1024);
//接收发送端发送数据
ds.receive(dp);//会让线程阻塞状态
//关流
ds.close();
//解析数据包
//返回IP地址
System.out.println(dp.getAddress());
//getData---接收到数据
//getLength---接收数据内容长度
//展示接收的数据
System.out.println
(new String(dp.getData(),0,dp.getLength()));
}
}
底层基于流,传输建立连接(三次握手)、安全(可靠)传输速度慢
底层根据IO流来进行数据传输,不限制传输数据大小
适用场景:上传和下载、聊天等等
Socket、ServerSocket
客户端
1.创建TCP客户端对象
2.发起连接(指定IP地址和端口号)
3.获取自带字节流往服务器端写出数据
4.写出数据
5.通知服务器端数据已经发送完毕
6.关流
package cn.tedu.net.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class TCPClientDemo {
public static void main(String[] args) throws IOException {
//创建TCP客户端
Socket s=new Socket();
//发起连接
s.connect(new InetSocketAddress("127.0.0.1",9092));
//获取自带的字节输出流
//默认往服务器端来传输
OutputStream os=s.getOutputStream();
//写出数据
os.write("下午好".getBytes());
//通知服务器端数据已经发送完毕
s.shutdownOutput();
//从服务器端来获取数据
//获取自带字节输入流
InputStream is=s.getInputStream();
//自建缓冲区
byte[] bs=new byte[1024];
int len=-1;
while ((len=is.read(bs))!=-1){
//把读取到的内容进行展示
System.out.println(new String(bs,0,len));
}
//通知服务器端数据已经接收完毕
s.shutdownInput();
//关流
s.close();
}
}
服务器端
1.创建TCP服务器端对象监听端口号
2.接收连接
3.获取自带字节输入流从客户端来读取数据
4.读取数据
5.通知客户端数据已经读取完毕
6.关流
package cn.tedu.net.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServerSocketDemo {
public static void main(String[] args) throws IOException {
//创建TCP服务器端对象---监听端口号
ServerSocket ss=new ServerSocket(9092);
//接收连接
Socket s=ss.accept();
//获取自带的字节输入流(默认读取客户端发送数据)
InputStream is=s.getInputStream();
//自建缓冲区
byte[] bs=new byte[1024];
int len=-1;
while ((len=is.read(bs))!=-1){
//把读取到的内容进行展示
System.out.println(new String(bs,0,len));
}
//通知客户端数据已经接收完毕
s.shutdownInput();
//把服务器端的数据发送到客户端
//获取自带的字节输出流---往客户端发送数据
OutputStream os=s.getOutputStream();
//发送数据
os.write("你也好".getBytes());
//通知客户端数据已经发送完毕
s.shutdownOutput();
//关流
s.close();
ss.close();
}
}
让线程阻塞的方法—receive()、connect()、accept()、write()、read()