黑马程序员_JAVA UDP网络编程学习笔记

一、UDP网络编程概述

  采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路。与TCP通信不同,UDP是面向无连接的、不可靠的基于数据包的传输协议。即应用进程(或程序)在使用UDP协议之前,不必先建立连接。自然,发送数据结束时也没有连接需要释放。因此,减少了开销和发送数据之前的延时。UDP也采用端口来区分进程。

  在java中,java.net.DatagramSocket负责接收和发送UDP数据报文,java.net.DatagramPacket表示UDP数据报。每个DatagramSocket与一个数据报套接字(包括本地主机的IP地址和本地UDP端口)绑定,每个DatagramSocket可以把UDP数据报发送给任意一个远程DatagramSocket,也可以接收来自任意一个远程DatagramSocket的数据报。在UDP数据报中包含了目的地址信息,DatagramSocket可以根据该信息把数据报发送的目的地。

  UDP协议是无连接的协议。客户端的DatagramSocket与服务端DatagramSocket不存在一一对应关系,两者无需建立连接,就能交换数据报。每个DatagramSocket对象都会与一个本地端口绑定,在此端口监听发送过来的数据报。在服务器程序中,一般由程序显示地为DatagramSocket指定本地端口。在客户程序中,一般由操作系统为DatagramSocket分配本地端口,这种端口也称为匿名端口。

二、关于DatagramSocket类和DatagramPacket类

  DatagramSocket类的构造方法如下:

  DatagramSocket()throws SocketException

  作用:构造数据报套接字并将其绑定到本地主机上任何可用的端口。套接字将被绑定到INADDR_ANY地址,IP地址由内核来选择。

  DatagramSocket(int port)throws SocketException

  作用:创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到INADDR_ANY地址,IP地址由内核来选择。

  DatagramSocket类的常用方法如表所示:

DatagramSocket类的常用方法
void send(DatagramPacket p) throws IOException 发送一个UDP数据包。一个UDP数据包就是一个DatagramPacket对象
void receive(DatagramPacket p) throws IOException 接收一个UDP数据包。一个UDP数据包就是一个DatagramPacket对象
void connect(InetAddress address,int port) 将该UDPSocket变成连接型的UDPSocket
void disconnect() 将该UDPSocket变成一个非连接型的UDPSocket
void close() 关闭UDPSocket连接

  其中,UDPSocket分为“连接型”与“非连接型”两种。默认UDPSocket是“非连接型”的,这个连接不是指向TCP那样进行三步握手,而只是将对方信息与自己关联在一起。

  DatagramPacket类的对象代表了一个UDP数据报包。通过UDP发送数据时,先要根据发送的数据生成一个DatagramPacket对象,然后通过DatagramSocket对象的send()方法发送这个对象。接收时,先要根据要接收数据的缓冲区生成一个Datagrampacket对象,然后通过DatagramPacket对象的receive()方法接收这个对象的数据内容。

  DatagramPacket类的构造方法分为两类:

  一类是创建DatagramPacket对象用来接收数据报包;

  另一类是创建DatagramPacket对象用来发送数据报包。

  它们的区别是,用于发送数据报包的构造方法需要设置数据报包达到的目的地址,若是“连接型”UDP,则不需要设定目的地址,而用于接收数据报包的构造方法无须设定地址。

  用于接收数据报包的构造方法如下:

  DatagramPacket(byte[] buf,int length)

  作用:由接收缓冲区生成一个DatagramPacket对象。buf表示保存传入数据报的缓冲区,length表示要读取的字节数。

  DatagramPacket(byte[] buf,int offset,int length)

  作用:构造DatagramPacket对象。用来接收长度为length的数据包,并在缓冲区中指定了偏移量。

  用于发送数据报包的构造方法如下:

  DatagramPacket(byte[] buf,int length,InetAddress address,int port)

  作用:构造数据报包发送的对象,用来将长度为length的包发送到指定主机上的指定端口号。length参数要小于等于buf的长度。

  DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)

  作用:构造数据报包发送的对象,用来将长度为length且偏移量为offset的包发送到指定主机上的指定端口号。length参数要小于等于buf的长度。

DatagramPacket类的常用方法如下表:

DatagramPacket类的常用方法
byte[] getData() 返回DatagramPacket对象中包含的数据
int getLength() 返回发送/接收数据的长度
int getOffset() 返回发送/接收数据在byte[]中的偏移
InetAddress getAddress() 返回对方的IP地址。用InetAddress对象表示
int getPort() 返回对方的端口号
void setData(byte[] buf,int offset,int length) 设置该对象中包含的数据
void setAddress(inetaddress iaddr) 设置该对象中包含的IP地址
void setPort() 设置该对象中包含的端口号

  通过UDP发送/接收数据步骤:

  发送数据,先要根据发送的数据生成一个DatagramPacket对象,并指定发送长度和接收数据的IP地址和端口号,然后通过DatagramSocket对象的send()方法发送这个对象。

  接收数据,根据要接受收数据的缓冲区及大小生成一个DatagramPacket对象,然后通过DatagramSocket对象的receive()方法接收这个对象的数据内容。

三、UDP网络编程练习

  练习代码:

package com.ItHeima.WeekAct;

/**服务器**/

import java.net.*;

public class ChatterClient extends Thread {

    private DatagramSocket socket;
    private InetAddress address;
    private byte[] buf = new byte[1000];
    private DatagramPacket packet = new DatagramPacket(buf, buf.length);//创建要发送的数据包
    private int id;//客户端id

    public ChatterClient(int id) {
        this.id = id;
        try {
            socket = new DatagramSocket();//创建UDP套接字
            address = InetAddress.getByName(null);//取得本地地址
        } catch (SocketException e) {
            System.out.println("can not open socket");
            e.printStackTrace();
            System.exit(1);
        } catch (UnknownHostException e) {
            System.out.println("Can not find host");
            System.exit(1);
        }
        System.out.println("ChatterClient starting");
        start();//之后调用run()
    }

    public void run(){
        try {
            for(int i = 0 ; i < 25 ; i++){
                String outMsg = "服务器你好,这是我客户端发过来的数据,请接收!" + id + ",消息" + i;//要发送到服务器的数据
                socket.send(new DatagramPacket(outMsg.getBytes(),outMsg.getBytes().length, address, ChatterServer.INPORT));//打包数据并将其发送到指定地址+端口的服务端
                socket.receive(packet);//接收服务端返回的数据包
                String msg=new String(packet.getData(),packet.getOffset(),packet.getLength());//获取服务器返回的信息
                String rcvd = "客户端收到来自客户端的信息:"+ msg+ ", from adddress:" + packet.getAddress() + ",port:" + packet.getPort();//解析数据包
                System.err.println(rcvd);//打印数据信息
                String returnMasg = "服务器返回信息:你好客户端,这是你发过来的数据:" + msg+",我将它原样返回";
                DatagramPacket echo = new DatagramPacket(returnMasg.getBytes(), returnMasg.getBytes().length,packet.getAddress(), packet.getPort());//将接收到包重新包装称UDP数据包准备原封不动的返回给客户端
                socket.send(echo);//反馈数据包
            }
        }catch (SocketException e) {
            System.out.println("Can`t open socket");
            System.exit(1);
        }catch (IOException e) {
            System.out.println("Communication error");
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new ChatterServer();//运行服务器
    }
}

  运行结果:

黑马程序员_JAVA UDP网络编程学习笔记

时间: 2024-12-28 01:20:49

黑马程序员_JAVA UDP网络编程学习笔记的相关文章

黑马程序员——29,网络编程UDP

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一:网络传输----> 网络传输一般是先找到IP地址然后把数据发送到对方指定的应用程序上,网络应用程序都用数字进行标示,就是逻辑端口.通信规则就是协议,国际组织通信规则是TCP/IP.网络参考模型如图1所示. 图1 数据传输的时候都是从应用层开始往下推进,每过一层都会被数据封包,再经过传输线路传输到对方的主机上,再从物理层往上层层递进,每过一层都会被数据拆包,最后获得数据. 前期学习编程都是在

黑马程序员——java基础---网络编程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.网络通讯 概念:网络间数据的传输.交互. 三要素:IP地址.端口号.传输协议. ——>IP地址 1.网络中设备的标识 2.单纯的IP地址不易记忆,可用主机名替代. 3.如果本机上没有配置任何IP地址的情况下,本机默认的IP地址为127.0.0.1 本地回环地址:127.0.0.1  主机名:localhost 用处:检验本机网卡是否运行正常等. ——>端口号 概念:用于标识进程的数字称为

黑马程序员——java高新技术——网络编程

点击打开链接 点击打开链接 点击打开链接 android培训.<a">点击打开链接 点击打开链接 java培训.期待与您交流!">点击打开链接 点击打开链接 网络编程 网络模型 l   OSI参考模型 l   TCP/IP参考模型 网络通讯要素 l   IP地址:网络中设备的标识,不易记忆,可用主机名,本地回环地址,127.0.0.1  主机名:localhost l   端口号:用于标识进程的逻辑地址,不同进程的标识,有效端口:0~65535,其中0~1024系统使

黑马程序员——JAVA基础-网络编程-TCP

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- TCP传输 两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流.该流中既有读取,也有写入. tcp的两个端点:一个是客户端,一个是服务端. 客户端:对应的对象,Socket 服务端:对应的对象,ServerSocket TCP客户端: ①:建立tcp的socket服务,最好明确具体的地址和端口.这个对象在创建时,就已经可以对指定ip和端口

黑马程序员——Java基础——网络编程

第一讲 网络概述 1.网络通信三要素:电脑IP地址.软件本地端口号.网络间传输协议(国际通用的TIP/IP,还有很多其他的) 小知识:-ping 127.0.0.7可以测试网卡用 2.网络模型图列: 用户在运用层发出的数据,经过逐层打包后通过物理层传输到另一个模型中,然后逐层分解,找到端口,被另一个用户获得 IP地址:InetAddress• 网络中设备的标识• 不易记忆,可用主机名• 本地回环地址:127.0.0.1 主机名:localhost 使用java.net包中的InetAddress

黑马程序员----java基础--网络编程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.  网络参考模型  1.OSI参考模型和 TCP/IP 参考模型 七层描述: (1). 物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流. (2). 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装.这一层工作的设备是交换机,数据通过交换机来传输. (3). 网络层:主要将下层接收到的数据进行I

黑马程序员——Java基础——网络编程02

第一讲 TCP的应用 使用TCP客户端上传图片: 1 /*使用TCP客户端上传图片 2 * 注:单线程的服务端有个举行性:当A客户客户端连接上一行,被服务端获取,B客户必须等待 3 * 那么为了可以让多个客户端同时并发访问服务器,最后服务短短将每个客户端封装一个单独的线程中 4 * 5 * 定义线程的方法 6 * 只有明确了每一个客户端要在服务端执行的代表.就将该代码存入run()方法中 7 */ 8 import java.io.*; 9 import java.net.*; 10 //客户端

黑马程序员_Java网络编程

1,IP地址和InetAddress IP地址是互联网上每台计算机都有的自己的标记,IP地址分为5类,A类保留给政府,B类给中等规模的公司,C类给任何需要的人,D类用于组播,E类用于实验. A类  1.0.0.1-126.255.255.254  B类  128.0.0.1-191.255.255.254   C类  192.0.0.1-223.255.255.254  D类 244.0.0.1-239.255.255.254 E类 240.0.0.1-255.255.255.254 在以后开发

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点