JAVA基础之网络编程


前言

前天学习了JAVA基础的网络编程。记录一下。


一、线程通信

线程通信就线程和线程之间的对某些资源的共同的利用。

用到的主要方法是:

			wait : 当对象调用wait,作用为当前线程对进入到与该对象相关的等待池中进行等待,等待被唤醒|最多等待指定时间,这个等待状态为阻塞状态
            final void wait()
            使当前线程等待直到它被唤醒,通常是通过被通知或被中断。
            final void wait(long timeoutMillis)
            使当前线程等待直到它被唤醒,通常是通过通知或中断,或者直到经过一定的实时时间。
            final void wait(long timeoutMillis, int nanos)
            使当前线程等待直到它被唤醒,通常是通过通知或中断,或者直到经过一定的实时时间。
            notify : 当通过对象调用notify方法时候,会唤醒该对象等待池中正在等待的线程,唤醒之后相等于被激活,想要执行还是需要cpu的调度+同时获取对象锁资源
            final void notify()
            唤醒正在此对象的监视器上等待的单个线程。
            final void notifyAll()
            唤醒正在此对象的监视器上等待的所有线程。

举一个简单的例子,过红绿灯的时候。红灯车走,绿灯人走。通过线程通信模拟下面的例子。

示例代码如下:

public class Class_11_Thread_Communication {
    public static void main(String[] args) {
        Stree stree = new Stree();
        new Thread(new Person(stree)).start();
        new Thread(new Car(stree)).start();
    }
}

class Stree {
    //信号灯
    private boolean lamp = true;

    //人 走的方向
    public synchronized void we() throws InterruptedException {
        if (lamp) {
            System.out.println("行人通过");
        }
        lamp = false;
        Thread.sleep(1000);
        //唤醒对方线程
        this.notify();
        //自己等待
        this.wait();
    }
    //车
    public synchronized void ns() throws InterruptedException {
        if (!lamp) {
            System.out.println("车通过");
        }
        lamp = true;
        Thread.sleep(1000);
        //唤醒对方线程
        this.notify();
        //自己等待
        this.wait();
    }
}
class Person implements Runnable {
    Stree stree = null;
    int i = 0;

    public Person(Stree stree) {
        this.stree = stree;
    }
    @Override
    public void run() {
        while (i < 10) {
            try {
                stree.we();
                i++;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

class Car implements Runnable {
    Stree stree = null;
    int i = 0;
    public Car(Stree stree) {
        this.stree = stree;
    }

    @Override
    public void run() {
        while (i < 10) {
            try {
                stree.ns();
                i++;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

输出结果如下:
在这里插入图片描述
注意多个线程的时候,notify()将随机唤醒线程。

二、网络编程

1.IP

网络编程 :
IP : 定位节点
端口号 : 区分不同的软件
URL : 统一资源定位符

传输层协议 : 标准,合同,要求
UDP : 相当于写信 不安全 协议简单,开销小,效率高 大小存在限制
TCP : 相当于打电话 面相连接的 安全 效率较低 大小没有限制

IP : 定义网络中的节点(电脑,手机,路由器…)
InetAddress : 此类表示 Internet 协议 (IP) 地址。
IP: IPV4 IPV6

特殊的IP :
192.168.0.0~192.168.255.255 非注册IP ,供组织内部使用IP
127.0.0.1 本地IP
域名 - IP : DNS解析器

示例代码如下:

public class Class_12_IP {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress =InetAddress.getLocalHost();//获取本地IP地址的方法
        byte[] bytes =inetAddress.getAddress();
        for (byte ipSegment : bytes)
        {
            int newIPSegment = (ipSegment < 0) ? 256 + ipSegment : ipSegment;
            System.out.print(newIPSegment + ".");
        }
        System.out.println(inetAddress);
        InetAddress inetAddress1 = InetAddress.getByName("www.clashnode.com");//获取链接的IP地址方法。
        System.out.println(inetAddress1);
    }
}

输出结果如下:
在这里插入图片描述

2.UDP协议

使用UDP协议传输数据效率高。但缺点也很明显就是不安全。

注意一定要先运行接收端!

示例代码如下:

//这是发送端
public class Class_13_UDP_Se {
    public static void main(String[] args) throws IOException {
        System.out.println("-------我是发送端-------");
        //定义发送端
        DatagramSocket up = new DatagramSocket(9000);
        //打包数据
        byte[] bytes = "我是迪迦".getBytes();
        //打包
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("192.168.10.50", 9888));
        //发送
       up.send(packet);
        //关闭
       up.close();


    }
}
//这是接收端
public class Class_14_UDP_Re {
    public static void main(String[] args) throws IOException {
        //接收
        System.out.println("---我是接收端---");

        //定义接收端
        DatagramSocket re = new DatagramSocket(9000);
        //准备包裹
        byte[] bytes = new byte[1024];
        //接收

        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
        //接收数据
        re.receive(packet);
        //处理数据
        byte[] date = packet.getData();
        int len = packet.getLength();
        System.out.println(new String(date, 0, len));
        re.close();

    }
}


结果如下图所示:
在这里插入图片描述
在这里插入图片描述

3、TCP传输

tcp协议 : 相当于打电话,面相连接 基于三次握手连接,基于四次挥手断开 效率低,安全 没有大小限制 数据传输基于IO流 两端不平等

Socket : 此类实现客户端套接字(也称为“套接字”)。 套接字是两台机器之间通信的端点。 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。 InputStream getInputStream()返回此套接字的输入流。 OutputStream getOutputStream() 返回此套接字的输出流。
void close()关闭此套接字。 ServerSocket : 此类实现服务器套接字。 服务器套接字等待通过网络进入的请求。
ServerSocket(int port) 创建一个绑定到指定端口的服务器套接字。 Socket accept()
侦听要与此套接字建立的连接并接受它。 void close() 关闭此套接字。

TCP协议下基础数据传输 : 客户端
1.定义我是客户端,同时建立与服务器端的连接,如果连接建立不成功,抛出异常,因为连接被拒绝
2.准备数据
3.获取字节输出流,往服务器发送数据
4.刷出
5.关闭

示例代码如下:

public class Class_15_Client {
    public static void main(String[] args) throws IOException {
        System.out.println("客户端");
        //定义我是客户端
        Socket clinet = new Socket("localhost",9996);
        System.out.println(clinet.getLocalPort());
        //准备数据
        String msg="我是迪迦";
        //获取字节输出流,发往叔无欺发送数据
        DataOutputStream os = new DataOutputStream(clinet.getOutputStream());
        os.writeUTF(msg);
        //刷出
        os.flush();
        os.close();
    }
}

public class Class_16_Server {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器端");
        //1、建立我是服务器
        ServerSocket serverSocket = new ServerSocket(9996);
        //阻塞监听
        Socket client = serverSocket.accept();
        //3、获取输入流
        DataInputStream is = new DataInputStream(client.getInputStream());
        //处理数据
        String msg = is.readUTF();
        System.out.println(msg);
        is.close();
        client.close();
        serverSocket.close();
    }

}

输出结果如下:
在这里插入图片描述
在这里插入图片描述


总结

学习了一些网络传输的协议。明天继续加油!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值