java网络多线程的初步学习

这阶段的学习资料为

【韩顺平讲Java】Java网络多线程专题 - TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 Java_哔哩哔哩_bilibili本视频教程是 Java 网络多线程专题,包括 TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 游戏 io 线程 网络 等内容 韩顺平https://www.bilibili.com/video/BV1j54y1b7qv?spm_id_from=333.999.0.0        主要是跟着视频对网络有了一个初步的认识,下面是个人的笔记

        可以自己查看有道云笔记icon-default.png?t=LA92https://note.youdao.com/s/YixLyZBf

个人重点总结:

   TCP协议:传输控制协议

      • 使用TCP协议之前,须先建立TCP连接,形成传输数据通道
      • 传输前,采用三次握手的方式是可靠的
      • TCP协议进行通信的两个应用进程:客户端,服务端
      • 在连接中可以进行大数据量的传输
      • 传输完毕,需要释放已建立的连接,效率低

UDP协议:用户数据协议

      • 将数据,源,目的封装成数据包,不需要建立连接
      • 每个数据包的大小限制在64k内
      • 因无需连接,故是不可靠的
      • 发送数据结束无需释放资源(因为不是面向连接的),速度快
      • 举例:发短信

Socket

基本介绍:

  1. 通信的两端都要有Socket,是两台机器间通信的端点
  2. 网络通信其实就是Socket间的通信
  3. Socket允许程序把网络连接当成一个流,数据在两个socket之间通过io传输
  4. 一般主动发起通信的的应用程序属于客户端,等待通信请求的为服务端

TCP网络通信编程

  1. 基于客户端-服务端的网络通信
  2. 底层使用的是TCP/IP协议
  3. 应用场景:客户端发送数据,服务端接收并显示
  4. 基于Socket的TCP编程

实例:

客户端:

public class Client {
    public static void main(String[] args) throws IOException {
        //1.连接服务端(ip,端口)
        //连接本机的9999端口 ,如果连接成功,返回socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(),6666);

        BufferedInputStream buf = new BufferedInputStream(new FileInputStream("E:\\1\\1.png"));

        //字节流转数组
        byte[] bytes = StreamUtils.InputStreamTOByte(buf);


        //通过socket获取输出流, 将字节数组输出到服务端
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
        bufferedOutputStream.write(bytes); //写入数据通道
        socket.shutdownOutput();

        String s = StreamUtils.InputStreamTOString(socket.getInputStream());
        System.out.println(s);


        bufferedOutputStream.close();
        bufferedOutputStream.close();
        socket.close();


    }
}

 服务端:

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(6666);
        Socket accept = serverSocket.accept();

        //获取客户端发送的数据
        //得到输入流
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
        //字节流转数组
        byte[] bytes = StreamUtils.InputStreamTOByte(bis);

        BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("E:\\1\\a.png"));
        bos.write(bytes);

        BufferedWriter bufferedWriter =  new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bufferedWriter.write("收到图片");
        bufferedWriter.flush();
        accept.shutdownOutput();
        bufferedWriter.close();

        bos.close();
        bis.close();
        accept.close();
        serverSocket.close();
    }
}

UDP网络通信编程 

   基本介绍:

  1. 类DatagramSocket和DatagramPacket(数据报/数据包)实现了基于UDP协议网络程序
  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全送到目的地,也不能确定什么时候可以抵达
  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的ip地址和端口号,数据
  4. UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

 UDP网络编程示意图 

 基本流程

  1. 核心的两个类DatagramSocket和DatagramPacket
  2. 建立发送端和接收端(没有服务端和客户端概念)
  3. 发送数据前,建立数据报/数据包(DatagramPacket)对象
  4. 调用DatagramSocket的发送,接收方法
  5. 关闭DatagramSocket

实例: 

发送端

public class UDPSenderB {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(9998);

        //2.将需要的课程封装到DatagramPacket data内容字节数组,data.length,ip地址,端口
        byte[] data = "你好啊,明天吃饭".getBytes();

        DatagramPacket datagramPacket = new DatagramPacket(data,data.length, InetAddress.getByName("192.168.1.6"),9999);

        InetAddress byName = InetAddress.getByName("192.168.1.3");
        System.out.println(byName);
        socket.send(datagramPacket);
        socket.close();
        System.out.println("发送完成");
    }
}

 接收端

public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(9999);
        //2.构建一个DatagramPacket对象,准备接收数据  数据包最大为64kb
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
        //3.调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        //注意:当数据包发送到本机的9999端口时,就会接收数据,当没有数据发送到9999端口时,就会阻塞
        System.out.println("接收端A等待接收数据");
        socket.receive(packet);

        //4.把packet进行拆包,取出数据,并显示
        int length = packet.getLength();//接收的数据长度
        byte[] data = packet.getData();//接收的数据

        String s = new String(data, 0, length);
        System.out.println(s);

        System.out.println("接收端A接收数据完成");
    }
}

总结:

        发送端,发送的客户端ip有错误,他也会发送完成,不知道接收方是否接收成功发送端就会退出,而接收端因为没接收到数据一直会阻塞,不会退出

QQ登录实战 

 最后实战链接放到了gitee上,离线消息也已经实现

网络: 控制台实现了qq的私聊,群发,发送文件,消息推送,退出登录功能icon-default.png?t=LA92https://gitee.com/liang0608/network

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值