`

Java TCP/IP Socket 编程 笔记(三)—UDP的例子

    博客分类:
  • java
阅读更多
1.UDP套接字与TCP套接字不同。UDP套接字在使用前不需要进行连接。TCP协议与电话通信相似,而UDP协议则与邮件通信相似:你寄包裹或信件时不要进行“连接”,但是你的为每个包裹和信件制定目的地址。类似地,每条信息(datagram,即数据报文)负载了自己的地址信息,并与其他信息相互独立。在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建,UDP套接字就可以用来连续地向不同的地址发送消息,或从任何地址接收信息。
UDP套接字将保留边界信息。UDP不像TCP一样,它是尽可能地传送消息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部分寄信一样)。因此,UDP套接字的程序必须准备好处理信息的丢失和重排。
UDP的优点之一是效率较高,其次是灵活性。

Java通过DatagramPacket类和DatagramSocket类来使用UDP套接字。客户端和服务端都使用DatagramSocket来发送数据,使用DatagramPacket来接收数据。

发送信息时,Java程序创建一个包含了待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket类的send()方法。接收信息时,Java程序首先创建一个DatagramPacket类的实例,该实例中预先分配了一些空间(一个字节数组byte[]),并将接收到的信息存放在该空间中。然后把该实例作为参数传递给DatagramSocket类的receive()方法。

DatagramPacket的内部有length和offset字段,如果指定了offset,数据报文的数据部分将从字节数组的指定位置发送或接收数据。length参数指定了字节数组中在发送时要传输的字节数,活在接收数据时所能接收的最多字节数。length要比data.length小,但不能比它大。

UDP客户端:
Java代码  收藏代码

    import java.io.IOException;  
    import java.io.InterruptedIOException;  
    import java.net.DatagramPacket;  
    import java.net.DatagramSocket;  
    import java.net.InetAddress;  
      
    public class UDPEchoClientTimeout {  
        private static final int TIMEOUT=3000;  
        private static final int MAXTRIES=5;  
          
        public static void main(String[] args) throws IOException {  
            if(args.length<2||args.length>3){  
                throw new IllegalArgumentException("Parameter(s):<Server> <Word> [<Port>]");  
            }  
              
            InetAddress serverAddress=InetAddress.getByName(args[0]);//server address;  
            byte [] bytesToSend=args[1].getBytes();  
            int servPort=(args.length==3)?Integer.parseInt(args[2]):7;  
              
            //1.创建一个DatagramSocket实例,可以选择对本地地址和端口进行设置。   
            DatagramSocket socket=new DatagramSocket();  
            //设置receive()方法的最长阻塞时间  
            socket.setSoTimeout(TIMEOUT);  
              
            DatagramPacket sendPacket=new DatagramPacket(bytesToSend,bytesToSend.length,serverAddress,servPort);  
            DatagramPacket receivePacket=new DatagramPacket(new byte[bytesToSend.length],bytesToSend.length);  
              
            int tries=0;  
            boolean receivedResponse=false;  
              
            do{  
                //2.使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例,进行通信  
                socket.send(sendPacket);  
                try{  
                    socket.receive(receivePacket);  
                    if(!receivePacket.getAddress().equals(serverAddress)){  
                        throw new IOException("Received packet from an unknown source");  
                    }  
                    receivedResponse=true;  
                }catch(InterruptedIOException e){  
                    tries+=1;  
                    System.out.println("Timed out,"+(MAXTRIES-tries)+" more tries ...");  
                }  
                  
            }while(!receivedResponse&&(tries<MAXTRIES));  
              
              
            if(receivedResponse){  
                System.out.println("Received: "+new String(receivePacket.getData()));  
            }else{  
                System.out.println("No response -- giving up.");  
            }  
              
            //3.通信完成后,使用DatagramSocket类的close方法来销毁该套接字  
            socket.close();  
        }  
    }  



UDP的服务器端:
Java代码  收藏代码

    import java.io.IOException;  
    import java.net.DatagramPacket;  
    import java.net.DatagramSocket;  
      
    public class UDPEchoServer {  
        private static final int ECHOMAX=255;//max size of echo datagram  
          
        public static void main(String[] args) throws IOException {  
            if(args.length!=1){  
                throw new IllegalArgumentException("Parameter(s):<Port>");  
            }  
              
            int servPort=Integer.parseInt(args[0]);  
              
            //1.创建一个DatagramSocket实例,指定本地端口号,可以选择指定本地地址  
            DatagramSocket socket=new DatagramSocket(servPort);  
            DatagramPacket packet=new DatagramPacket(new byte[ECHOMAX],ECHOMAX);  
              
            while(true){  
                //2.使用DatagramSocket的receive方法来接收一个DatagramPacket实例。  
                socket.receive(packet);  
                System.out.println("Handling client at "+packet.getAddress().getHostAddress()+" on port "+packet.getPort());  
                  
                socket.send(packet);  
                packet.setLength(ECHOMAX);  
            }  
        }  
    }  



注意:DatagramPacket的getData()方法的使用,它返回数据缓冲区,是一个字节数组,需要注意。
  packet.setData(buf, offset,length);设置了接收数据时放到缓存去buf中的位置
,因此接收的数据new String(packet.getData(),packet.getOffset(),packet.getLength())的方式构造的。
分享到:
评论

相关推荐

    TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client

    SocketTool V4.0版本支持JavaScript编程方式,从而增加了灵活性。 JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,广泛用于客户端的脚本...

    Socket TCP Java 高清学习资料合集

    包括 1.TCP-IP详解卷1:协议 中文版PDF...2.高级TCP/IP编程 中文版PDF 3.TCPIP Sockets in Java 2nd 英文版PDF, 4.Advanced JAVA networking英文版PDF 5.中文版Socket Java教程 6.Socket Java学习笔记 7.UDP简单案例

    Socket网络编程学习笔记.zip

    该笔记主要介绍的网络编程中涉及的网络计算机的基本概念,第二章及第三章分别对TCP./IP、UDP两种网络编程进行了不同级别的编程解释,适合初次接触网络编程的朋友,通俗易懂,希望对大家有用

    Linux网络编程超级详细笔记

    Socket编程:Socket是用于实现网络通信的编程接口,支持基于TCP/IP协议的传输,包括TCP和UDP。在Linux下,使用Socket编程可以实现网络通信,包括客户端和服务器端。 IP地址和端口:IP地址是用于标识网络上的设备的...

    Linux网络编程socket编程学习

    自学Linux网络编程关于socket的编写,包括 server.c 和 client.c 的编写;很详细的介绍了网络套接字socket的C/S模型TCP协议的服务器端和客户端的程序函数以及编写过程;重点介绍多路I/O转接服务器的实现,包括select...

    Java网络编程(第3版) 中文版

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Linux协议栈阅读笔记

    TCP/IP本身是一个协议族,还包括ARP,ICMP,UDP等协议。是事实上的行业标准。  网络架构 ISO提出的七层架构。网络协议栈的实现基本采用TCP/IP的四层架构(链路、网络、传输、应用)。不过在实际学习中通常讲到的是5...

    通信与网络中的VC++环境下基于WinSock的网络通信

    引言  随着Internet的迅猛发展,网络通信应用程序的开发成为研究热点。Windows环境下进行通讯程序设计的最基本方法是应用...TCP/IP网络环境下的应用程序是通过网络系统编程界面套接字Socket(在Windows操作系统

    python24期全套视频编程课程百度网盘

    5. 网络编程:介绍Python的网络编程、socket编程、TCP/UDP协议等知识。 6. 多线程编程:介绍Python的多线程编程、线程的创建、同步、锁等知识。 7. Web开发:介绍Python的Web开发、Django框架、MVC模式、ORM等知识...

    Java网络编程(第3版) 中文版 文件2

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    java学习笔记 初学者必读

    16.2. TCP Socket 16-54 16.2.1. 建立TCP服务器端 16-54 16.2.2. 建立TCP客户端 16-55 16.3. 建立URL连接 16-55 16.4. UDP socket 16-58 16.4.1. 建立UDP 发送端 16-58 16.4.2. 建立UDP 接受端 16-59 17. java5.0的...

    网络编程笔记(包含测试代码)

    笔记共八章: 1、概述 2、网络通信的要素 3、IP 4、端口 5、通信协议 6、TCP 7、UDP 8、URL

    linux网络编程学习笔记

    netstat 命令 netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的 选项 我们常用的选项是 -an 用来显示详细的网络...的服务 我们可以调用第四个函数,相反为了得到端口号可以调用第三个函数.

    负载均衡技术研究笔记

    为什么需要负载均衡? Load balancing,就是负载均衡,是一种计算机技术。资源分配不均衡,吞吐量低,相应时间慢,过载损坏!...传输层 tcp/udp 数据包 网络层 ip 数据链路层 mac地址转发 物理层 各种比特流

    python网络编程学习笔记(二):socket建立网络客户端

    1、建立socket ...因此对于TCP通信,建立一个socket连接的语句为:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)对于UDP通信,建立一个socket连接的语句为:s=socket.socket(socket.AF_INET,

    安卓第七天笔记--网络编程

    Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,还可以使用DatagramSocket,Datagrampacket,MulticastSocket来建立基于UDP的协议网络通信.同时支持JDK...

    Python树莓派学习笔记之UDP传输视频帧操作详解

    本文实例讲述了Python树莓派学习笔记之UDP传输视频帧操作。分享给大家供大家参考,具体如下: 因为我在自己笔记本电脑上没能成功安装OpenCV-Contrib模块,因此不能使用人脸识别等高级功能,不过已经在树莓派上安装...

    android学习笔记4--socket

    简单介绍了网络编程,和简单的使用方法,这部分属于java的基础只是,有必要了解下。

    NodeJS学习笔记之网络编程

    Node提供丰富的网络编程模块 Node模块 协议 net TCP dgram UDP http HTTP https HTTPS TCP服务事件分为下面两类 (1)、服务器事件 对于通过net.createServer()创建的服务器而言,它是一个...

Global site tag (gtag.js) - Google Analytics