Java的UDP通信



  1. /**
  2.  *UDPServer
  3.  *@author Winty wintys@gmail.com
  4.  *@version 2008-12-15
  5.  */
  6. import java.io.*;
  7. import java.net.*;
  8. class UDPServer{
  9.     public static void main(String[] args)throws IOException{
  10.         DatagramSocket  server = new DatagramSocket(5050);
  11.         byte[] recvBuf = new byte[100];
  12.         DatagramPacket recvPacket 
  13.             = new DatagramPacket(recvBuf , recvBuf.length);
  14.         server.receive(recvPacket);
  15.         String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
  16.         System.out.println("Hello World!" + recvStr);
  17.         int port = recvPacket.getPort();
  18.         InetAddress addr = recvPacket.getAddress();
  19.         String sendStr = "Hello ! I'm Server";
  20.         byte[] sendBuf;
  21.         sendBuf = sendStr.getBytes();
  22.         DatagramPacket sendPacket 
  23.             = new DatagramPacket(sendBuf , sendBuf.length , addr , port );
  24.         server.send(sendPacket);
  25.         server.close();
  26.     }
  27. }

  1. /**
  2.  *UDPClient
  3.  *@author Winty wintys@gmail.com
  4.  *@version 2008-12-15
  5.  */
  6. import java.io.*;
  7. import java.net.*;
  8. class UDPClient{
  9.     public static void main(String[] args)throws IOException{
  10.         DatagramSocket client = new DatagramSocket();
  11.         
  12.         String sendStr = "Hello! I'm Client";
  13.         byte[] sendBuf;
  14.         sendBuf = sendStr.getBytes();
  15.         InetAddress addr = InetAddress.getByName("127.0.0.1");
  16.         int port = 5050;
  17.         DatagramPacket sendPacket 
  18.             = new DatagramPacket(sendBuf ,sendBuf.length , addr , port);
  19.         client.send(sendPacket);
  20.         byte[] recvBuf = new byte[100];
  21.         DatagramPacket recvPacket
  22.             = new DatagramPacket(recvBuf , recvBuf.length);
  23.         client.receive(recvPacket);
  24.         String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
  25.         System.out.println("收到:" + recvStr);
  26.         client.close();
  27.     }
  28. }
=========================================================================================
用户数据报(UDP)是网络信息传输的一种形式。在《网络编程之了解TCP/UDP网络协议 》一文中已经讲到了UDP通信和TCP通信的不同,UDP传输数据快,但是不稳定。使用UDP通信时,用户无法知道数据能否正确到达主机,也不能确定到达目的地的顺序是否和发送顺序相同。虽然UDP是不可靠的,但是对于一些可以容忍小错误的信息传输,此时可以考虑UDP。 UDP的通信模式为:1.数据打包(数据包)。将数据包发往目的地。 2.接收比人发的数据包,然后读数据包内容。 UDP数据包发送步骤: 1.使用DatagramSocket()创建一个数据包套接字。 2.使用DatagramPacket()创建要发送的数据包。 3.使用DatagramSocket()类的send()方法发送数据包。 UDP数据包接收步骤: 1.使用DatagramSocket(int port)创建一个数据包套接字,绑定到指定端口。 2.使用DatagramPacket()创建字节数组接收数据包。 3.使用DatagramPacket()类的receive()方法接受数据包。 关于DatagramSocket类DatagramSocket类建立UDP程序的套接字。每个在数据报套接字上发送或接收的包都是单独编址和路由的。 方法1. new DatagramSocket();//创建绑定到本地主机上任何可用的端口 方法2. new DatagramSocket(int port);//创建绑定到本地主机上指定的端口 方法3. new DatagramSocket(int port,InetAddress address);//创建绑定的指定本地地址,方法适用于多块网卡和多个IP地址。 关于DatagramPacket类 此类表示数据报包,数据报包用来实现无连接包投递服务。每条报文只根据该包包含的信息,从一台计算机路由到另一台计算机。 方法1. new DatagramPacket(byte[] buf,int length);//指定接收长度创建对象。 方法2. new DatagramPacket(byte[] buf,int length,InetAddress address,int port);//指定数据包内存空间大小,同时指定数据包发送目标地址和端口。 以下程序演示如何实现,服务端接受数据,再发送数据。客户端发送数据,再接收数据。 服务器端代码:
 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 
 
public class UDPServer { 
 
    public static void main(String[] args) { 
        DatagramSocket server; 
        try { 
            server = new DatagramSocket(9999); 
            byte[] buf = new byte[100]; 
            DatagramPacket packet = new DatagramPacket(buf, buf.length); 
            server.receive(packet); 
            String str = new String(packet.getData(), 0, buf.length); 
            System.out.println("Hello!" + str); 
            int port = packet.getPort(); 
            InetAddress address = packet.getAddress(); 
            String str1 = "我是服务器,我广播信息给你"; 
            byte[] sendBuf; 
            sendBuf = str1.getBytes(); 
            DatagramPacket sendpacket = new DatagramPacket(sendBuf, 
                    sendBuf.length, address, port); 
            server.send(sendpacket); 
            server.close(); 
        } catch (Exception e) { 
 
            e.printStackTrace(); 
        } 
 
    } 
 
} 
客户端代码:
 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 
 
public class UDPClient { 
 
    public static void main(String[] args) { 
        DatagramSocket client; 
        try { 
            client = new DatagramSocket(); 
            String sendStr = "你好,我是客户机"; 
            byte[] sendBuf; 
            sendBuf = sendStr.getBytes(); 
            InetAddress address = InetAddress.getByName("127.0.0.1"); 
            int port = 9999; 
            DatagramPacket sendpacket = new DatagramPacket(sendBuf, 
                    sendBuf.length, address, port); 
            client.send(sendpacket); 
            byte[] recBuf = new byte[100]; 
            DatagramPacket recpacket = new DatagramPacket(recBuf, recBuf.length); 
            client.receive(recpacket); 
            String str = new String(recpacket.getData(), 0, recBuf.length); 
            System.out.println("收到:" + str); 
            client.close(); 
        } catch (Exception e) { 
 
            e.printStackTrace(); 
        } 
 
    } 
 
} 
执行结果: 服务端收到信息->Hello!你好,我是客户机. 客户端收到信息->我是服务器,我广播信息给你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值