您的位置:首页 > 理论基础 > 计算机网络

Java学习笔记-全栈-Java基础-11-网络编程

2020-01-13 21:14 281 查看

网络编程

  • 2. Socket编程
  • 1. 基本概念

    IP、端口、URL

    IP --> 节点(电脑等设备)
    端口 --> 软件
    URL --> 资源

    URL与URI的区别和关系:
    URL相当于绝对路径,URI相当于相对路径。

    URL: https://www.test.com/md/page3/img.png
    URI: md/page3/img.png

    分层网络协议

    ISO是通用参考模型,实际使用的层数往往更简单的,如TCP/IP。

    传输层:TCP(transfer control protocol)

    • 面像连接的、可靠的、点到点的通信、占用系统资源多、效率低、基于字节流的传输层通信协议。
    • 三次握手:拨号,确定收到,开始传输

    传输层:UDP(User DatagramProtocol)

    • 无连接的、传输不可靠(可能丢包)、发送不管对方是否准备好、接收方收到也不确认、可以广播发送、简单、开销小。

    应用层:HTTP协议

    • 应用层的协议,基于TCP的WWW标准协议

    传输层与应用层的连接:Socket(套接字)

    2. Socket编程

    2.1 基于TCP

    通信双方需要建立连接,连接建立时存在主次之分,先有服务端,再有客户端,之后没有主次之分

    2.2 基于UDP

    UDP所需元素:

    • 端口:仅用于receive(packer)和send(packer)

    • 数据:必须是字符数组

    • 容器:仅用于打包数据以及挂载目标地址DatagramPacket(datas,datas.length,new InetSocketAddress(ip,port));

    • send(client):发送端口,目标端口,发送数据以及发送容器

    • receive(server):接收端口,接收容器

    UDP特点:

    • 1.通信双方不需要建立连接,通信双方完全平等(如QQ聊天)
    • 2.一次数据包60k左右,不能太大
    • 3.不需要IO流实现传输,只需要字节数组
    • 4.使用的类: a)DatagramSocket:仅仅用于发送或接收数据包的套接字
    • b)DatagramPacket:数据包,包含传送的地址

    UDP实现流程

    • 接收端:

      1.使用DatagramSocket 指定端口 创建接收端
    • 2.准备容器 byte[] container = new byte[1024*60] 封装成DatagramPacket包裹
    • 3.阻塞式接收包裹 receive(DatagramPacket p)
    • 4.分析数据 a)Byte[] getDate()
    • b)getLength()
  • 5.释放资源
  • 发送端

      1.使用DatagramSocket 指定端口 创建发送端
    • 2.准备数据 转成字节数组
    • 3.将字节数组封装成DatagramPacket包裹 a)指定目的地 InetSocketAddress(address,端口)
  • 4.发送包裹 send(DatagramPacket p)
  • 5.释放资源 close
  • 2.3 数据封装与解封

    2.4 端口相关的cmd命令

    • 查看所有端口情况:netstat -ano
    • 查看指定端口:netstat -ano|findstr ”8080”
    • 查看指定进程:tasklist|findstr “8080”
    • 查看具体程序:任务管理器查看PID

    2.5. 将任意类型数据转为字节数组

    网络上的大多数据都需要通过字节数组传输,需熟练掌握任意类型转为字节数组的办法。

    • String类型用String.getBytes()即可

    • 由于java中的任意数据都可以转为Object,因此可以使用Object输入输出流实现转换。

    //将数据写入字节数组流
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(
    new BufferedOutputStream(baos));
    oos.write(10);
    oos.flush();
    
    //将字节数组流转为字节数组
    byte[] datas = baos.toByteArray();
    
    //将字节数组输出
    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(datas)));
    int revices= ois.read();
    System.out.println(revices);
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    舜绪 发布了46 篇原创文章 · 获赞 6 · 访问量 1247 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: