Java学习 DAY22 InetSocketAddress类、DUP\TCP协议

InetSocketAddress类—可以代表IP地址和端口号

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());
    }
}

UDP协议

底层基于流,传输不建立连接,不安全(不可靠)但是速度快
底层根据数据包(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()));
    }
}

TCP协议

底层基于流,传输建立连接(三次握手)、安全(可靠)传输速度慢
底层根据IO流来进行数据传输,不限制传输数据大小
适用场景:上传和下载、聊天等等
Socket、ServerSocket

通过TCP实现文件的上传和下载(文件复制)

客户端
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()

你可能感兴趣的:(java,线程,DUP\TCP协议,java,网络,网络协议,socket)