《Java网络编程技术-03.ppt》由会员分享,可在线阅读,更多相关《Java网络编程技术-03.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3章 UDP协议网络编程 UDP协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。在Java中,基于UDP协议实现网络通信的类有三个:用于表达通信数据的数据报类DatagramPacket 用于进行端到端通信的类DatagramSocket 用于组播通信的类MulticastSocket。3.1数据报通信数据报通信datagramservercli
2、ent2 类类DatagramPacket 构造方法public public DatagramPacket(DatagramPacket(bytebyte bufbuf,intintlength)length)public public DatagramPacket(DatagramPacket(bytebyte bufbuf,intintoffset,offset,intintlength)length):这两个方法用于接收数据这两个方法用于接收数据public public DatagramPacket(DatagramPacket(bytebyte bufbuf,intintlengt
3、h,length,InetAddressInetAddress address,address,intint portport)public public DatagramPacket(DatagramPacket(bytebytebufbuf,intintoffset,offset,intintlength,length,InetAddressInetAddressaddress,address,intintport)port):这两个方法用于发送数据这两个方法用于发送数据 获取数据获取接收报中的信息public public InetAddressInetAddress getAddres
4、sgetAddress()()public public bytebyte getDatagetData()()public public intint getLengthgetLength()()public public intint getOffsetgetOffset()()public public intint getPortgetPort()()设置数据设置发送报中的信息setAddress(setAddress(InetAddressInetAddress iaddriaddr)、setPort(setPort(intint iportiport)、setData(setDat
5、a(bytebytebufbuf)、setData(setData(bytebytebufbuf,intintoffset,offset,intintlength)length)、setLength(setLength(intintlength)length)3.2数据报通信数据报通信数据报数据报3 类类DatagramSocket 构造方法public public DatagramSocketDatagramSocket()()public public DatagramSocket(DatagramSocket(intintport)port):在指定的端口通信在指定的端口通信publi
6、c public DatagramSocket(DatagramSocket(intintport,port,InetAddressInetAddress laddrladdr):在指定的地点运行在指定的地点运行这三个方法都将抛出例外这三个方法都将抛出例外SocketExceptionSocketException,程序中需要捕获处理。程序中需要捕获处理。最主要的方法发送与接收数据报public void public void receive(receive(DatagramPacketDatagramPacketp)p)public void public void send(send(D
7、atagramPacketDatagramPacketp)p)这两个方法都将抛出例外这两个方法都将抛出例外IOExceptionIOException,程序中需要捕获处理。程序中需要捕获处理。其他方法public void public void connect(connect(InetAddressInetAddressaddress,address,intintport)port):与指定的机器通信与指定的机器通信public void disconnect()public void disconnect():关闭与指定机器的连接关闭与指定机器的连接public void close()p
8、ublic void close():关闭关闭SocketSocket3.3数据报通信数据报通信点到点通信点到点通信4建立数据报建立数据报socket();建立一个数据报建立一个数据报packet等待请求报文等待请求报文建立数据报建立数据报socket建立一个请求数据报建立一个请求数据报发出请求发出请求获得对方地址获得对方地址构成信息包构成信息包发送出去发送出去创建接收包创建接收包等待接收等待接收接收端接收端发送端发送端5SingleUDPClient.java看看这个点到点通信程序的运行效果:2、客户端(接收端)SingleUDPServer.java1、服务器端(发送端)6发送端发出数据报
9、的标准步骤:发送端发出数据报的标准步骤:1.定义数据成员 DatagramSocket socket;DatagramPacket packet;InetAddress address;(用来存放接收方的地址)int port;(用来存放接收方的端口号)2.创建数据报Socket对象 try socket=new DatagramSocket(4445);catch(.SocketException e)socket 绑定到一个本地的可用端口,等待接收客户的请求。73.分配并填写数据缓冲区(一个字节类型的数组)byte buf=new byte256;存放从客户端接收的请求信息。4.创建一个D
10、atagramPacket packet=new DatagramPacket(buf,256);用来从socket接收数据,它只需要两个参数。5.服务器阻塞 socket.receive(packet);在客户的请求数据报到来之前一直等待。86.从到来的包中得到地址和端口号 InetAddress address=packet.getAddress();int port=packet.getPort();7.将数据送入缓冲区 或来自文件、或键盘输入8.建立报文包,用来从socket上发送信息 packet=new DatagramPacket(buf,buf.length,address,p
11、ort);9.发送数据包 socket.send(packet);10.关闭socket socket.close();9接收端接收数据报的标准步骤:接收端接收数据报的标准步骤:1.定义数据成员 int port;InetAddress address;DatagramSocket socket;DatagramPacket packet;byte sendBuf=new byte256;2.建立socket socket=new DatagramSocket();103.向服务器发出请求报文 address=InetAddress.getByName(args0);port=parseInt
12、(args1);packet=new DatagramPacket(sendBuf,256,address,port);socket.send(packet);这个数据报本身带有客户端的信息4.客户机等待应答 packet=new DatagramPacket(sendBuf,256);socket.receive(packet);如果没有到就一直等待,因此实用程序要设置时间限度 5.处理接收到的数据 String received=new String(packet.getData();System.out.println(received);113.4 数据报通信数据报通信组播通信组播通信
13、 DatagramSocket只允许数据报发往一个目的地址。类包中提供了类MulticastSocket,允许将数据报以广播的方式发送到某个端口的所有客户。类MulticastSocket是在客户端使用,监听服务器广播来的数据;而服务器端仍然使用DatagramSocket来发送数据,只是发送的数据报的目的地址有所变化。12 类类MulticastSocket:从:从DatagramSocket继承而来继承而来 构造方法public public MulticastSocketMulticastSocket()()public public MulticastSocket(MulticastS
14、ocket(intintport)port):在指定的端口通信在指定的端口通信这两个方法都将抛出例外这两个方法都将抛出例外IOExceptionIOException,程序中需要捕获处理。程序中需要捕获处理。主要方法public void public void joinGroup(joinGroup(InetAddressInetAddress mcastaddrmcastaddr):加入一个广播组加入一个广播组public void public void leaveGroup(leaveGroup(InetAddressInetAddress mcastaddrmcastaddr):离开
15、一个广播组离开一个广播组public void public void setTimeToLive(setTimeToLive(intint ttl ttl):指定数据报离开时间指定数据报离开时间public void public void send(send(DatagramPacketDatagramPacketp,bytep,bytettl ttl):在指定的时间内将数据报发送出去在指定的时间内将数据报发送出去这四个方法都将抛出例外这四个方法都将抛出例外IOExceptionIOException,程序中需要捕获处理。程序中需要捕获处理。继承DatagramSocket的方法publi
16、c void public void receive(receive(DatagramPacketDatagramPacketp)p):接收数据接收数据 public void public void send(send(DatagramPacketDatagramPacketp)p):发送数据发送数据public void public void connect(connect(InetAddressInetAddressaddress,intport)address,intport):与指定的机器通信与指定的机器通信public void disconnect()public void d
17、isconnect():关闭指定的连接关闭指定的连接public void close()public void close():关闭关闭SocketSocket13MulticastSocket socket=new MulticastSocket(4446);InetAddress address=InetAddress.getByName(230.0.0.1);socket.joinGroup(address);/receive datagramsocket.leaveGroup(address);socket.close();InetAddress group=InetAddress.
18、getByName(230.0.0.1);DatagramPacket packet=new DatagramPacket(buf,buf.length,group,4446);socket.send(packet);客户端客户端服务器端服务器端14 广播组的IP地址是一类特殊的IP地址,它们没有分配给网上的硬件资源使用,而是专门保留下来作为广播通信使用的(就像127.0.0.1是专门用来描述本机IP一样)。这一类地址的范围是从224.0.0.0到239.255.255.255,其中地址 224.0.0.0又被保留不能被一般应用程序所使用。当前,广播通信只能在应用程序中使用,不能在Applet
19、中使用。15 许多防火墙和路由器可以配置为不允许UDP数据报进入。因此,如果想在这种环境下提供UDP网络服务,就需要请求系统管理员重新配置防火墙和路由器,以允许UDP数据报进入。163.5 UDP网络编程案例n1)网络编程UDP协议的“Hello,world”程序17nimport .*;nimport java.io.*;npublic class UDPClient n npublic static void main(String args)throws SocketException,IOExceptionnnString h=hello,world;nbyte b=h.getByte
20、s();nInetAddress iip=InetAddress.getByName(localhost);nDatagramSocket ds=new DatagramSocket();nDatagramPacket dp=new DatagramPacket(b,b.length,iip,3334);nds.send(dp);nn182)UDP协议聊天程序nimport java.awt.*;nimport java.awt.event.*;nimport java.io.*;nimport .*;nclass myClient extends Frame nnDatagramSocket
21、 ds1;nDatagramPacket dp1=null;nDatagramSocket ds2;nDatagramPacket dp2=null;nInetAddress iip;nbyte b;nPanel p1,p2;nButton bs;nTextArea t1;nTextField t2,t3;nLabel l1,l2;nttc t;19nmyClient(String ss)throws SocketException,IOExceptionnnsuper(ss);np1=new Panel();np2=new Panel();nt1=new TextArea();nt2=new
22、 TextField(那你就去吧,别让妖精迷住!,34);nl1=new Label(昵称);nl2=new Label(消息);nt3=new TextField(悟空);nbs=new Button(发送 );nbs.addActionListener(new bss();naddWindowListener(new ww();nsetLayout(new FlowLayout();np1.setLayout(new BorderLayout();np1.add(t1);nadd(p1);np2.setLayout(new FlowLayout();np2.add(l1);np2.add(
23、t3);np2.add(l2);np2.add(t2);np2.add(bs);nadd(p2);nsetBounds(100,100,460,260);nsetVisible(true);nds1=new DatagramSocket();20nds2=new DatagramSocket(3335);niip=InetAddress.getByName(localhost);nt=new ttc(this);nt.start();nnclass bss implements ActionListenernnpublic void actionPerformed(ActionEvent e)
24、nntryn ndp1=new DatagramPacket(t3.getText().trim()+:+t2.getText().trim().getBytes(),(t3.getText()+t2.getText().trim().getBytes().length,iip,3334);nds1.send(dp1);n t1.append(t3.getText().trim()+:+t2.getText()+n);nncatch(IOException e1)nnnclass ww extends WindowAdapternnpublic void windowClosing(Windo
25、wEvent ee)nnSystem.exit(0);nn21npublic static void main(String args)throws IOException,SocketException nnew myClient(Client);nnnclass ttc extends ThreadnnmyClient mc=null;nttc(myClient mc)nnthis.mc=mc;nnpublic void run()nnwhile(true)nntrynnmc.b=new byte1024;nmc.dp2=new DatagramPacket(mc.b,mc.b.lengt
26、h);nmc.ds2.receive(mc.dp2);nmc.t1.append(new String(mc.b).trim()+n);nncatch(IOException gg)nnn223)组播地址通信nimport .*;nimport java.io.*;nimport java.util.*;npublic class MultiCast nnprivate MulticastSocket ms=null;nprivate InetAddress ip=null;nprivate Scanner sc=null;nbyte b=new byte4096;nprivate Datag
27、ramPacket ind=new DatagramPacket(b,b.length);nprivate DatagramPacket outd=null;npublic void init()throws IOExceptionnntrynnms=new MulticastSocket(30000);nip=InetAddress.getByName(230.0.0.1);nms.joinGroup(ip);nms.setLoopbackMode(false);noutd=new DatagramPacket(new byte0,0,ip,30000);nnew myThread().st
28、art();nsc=new Scanner(System.in);n23nwhile(sc.hasNextLine()nnbyte buff=sc.nextLine().getBytes();noutd.setData(buff);nms.send(outd);nnnfinallynnms.close();nnnnclass myThread extends Threadnnpublic void run()nntrynnwhile(true)nnms.receive(ind);nSystem.out.println(消息:+new String(b,0,b.length);nnn24ncat
29、ch(IOException ex)nntrynnif(ms!=null)nnms.leaveGroup(ip);nms.close();nnSystem.exit(1);nncatch(IOException ss)nnnnnnn npublic static void main(String args)throws IOExceptionnnnew MultiCast().init();nn254)组播地址聊天程序nimport java.awt.event.*;nimport java.awt.*;nimport java.io.*;nimport .*;npublic class mu
30、ltiCast extends FramenPanel p1,p2;nButton bs;nTextArea t1;nTextField t2,t3;nLabel l1,l2;nprivate MulticastSocket ms=null;nprivate InetAddress ip=null;nbyte b=new byte1024;nprivate DatagramPacket ind=new DatagramPacket(b,b.length);nprivate DatagramPacket outd=null;26npublic multiCast(String ss)throws
31、 IOExceptionnnsuper(ss);np1=new Panel();np2=new Panel();nt1=new TextArea();nt2=new TextField(大师兄,我去捉妖精吧!,34);nt3=new TextField(八戒);nbs=new Button(发送 );nl1=new Label(昵称);nl2=new Label(消息);nbs.addActionListener(new bss();naddWindowListener(new ww();nsetLayout(new FlowLayout();np1.add(t1);nadd(p1);np2.
32、setLayout(new FlowLayout();np2.add(l1);np2.add(t3);np2.add(l2);np2.add(t2);np2.add(bs);nadd(p2);nsetBounds(100,100,460,260);nsetVisible(true);27nms=new MulticastSocket(30000);nip=InetAddress.getByName(230.0.0.1);nms.joinGroup(ip);nms.setLoopbackMode(false);noutd=new DatagramPacket(new byte0,0,ip,300
33、00);nnew myThread().start();nnclass myThread extends Threadnnpublic void run()nntrynnwhile(true)nnms.receive(ind);nt1.append(new String(b,0,ind.getLength().trim()+n);nnncatch(IOException ex)nnnn28nclass bss implements ActionListenernnpublic void actionPerformed(ActionEvent e)nn tryn n outd.setData(t3.getText()+:+t2.getText().trim().getBytes();n ms.send(outd);n ncatch(Exception e1)nnnclass ww extends WindowAdapternnpublic void windowClosing(WindowEvent ee)nnSystem.exit(0);nnnpublic static void main(String args)throws IOException nnnew multiCast(multiCast);nn29
限制150内