20150803-UDP

一、与TCP区别:

不用建立连接,只管发包,可能会丢失;
不可靠的网络协议;
两端建立socket,但没有虚拟连接;
传输包大小限制(64K以下);
DatagramSocket类:建包
发包:send ; 收包:receive

范例1:

接收端:
步骤:
1.DatagramSocket 套接字建立,传入监听端口
2.DatagramPacket 建包(提前定义好要传入包的数组,用来接收长度为lenth的数据包)
3.等待接收:receive
4.通过socket的getData()方法获得其中的数据,并显示
5.关闭流,(关的是socket流)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Receive {

    public static void main(String[] args) {
        try {
            DatagramSocket dsRecive =new DatagramSocket(8080); //SocketException异常
            byte[] arr = new byte[1024];
            DatagramPacket dpRecive = new DatagramPacket(arr, 1024);//接收包中参数:接到存入的数组,即存入长度
            dsRecive.receive(dpRecive);//IOException异常

            byte[] data = dpRecive.getData();//通过getData得到数据
            System.out.println(new String(data));
            dsRecive.close();   //关闭的是socket
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

发送端:
步骤:
1.建套接字socket
2.建包(提前定义好字节数组),包中包括发过去的数组,长度,发到的ip地址,以及端口。
3.调用套接字的send方法发送
4.关闭流。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Send {

    public static void main(String[] args) {
        try {
            DatagramSocket daSend = new DatagramSocket(); //SocketException异常
            String s = "你好!";
            byte[] arr = s.getBytes();
            //InetAddress.getLocalHost()【返回主机地址】可以换成InetAddress.getByName("192.168.0.74")【返回相应主机的IP】, 
            DatagramPacket dpSend = new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 8080);//SocketException异常
            System.out.println("开始发送:");
            daSend.send(dpSend);//IOException异常,注:是socket发送包
            daSend.close();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

范例2:聊天

发送:
步骤:
1.建立发送端的socket和接收端的socket(接收端指定监听端口)
2.建立键盘输入对象scanner
3.循环体;
1)建立包对象,指定出入的字节数组以及目的地ip及短裤。
2)发送端套接字利用send方法发送包。

3)建立接收包对象,指定接收到的数据放入的数组,及接收长度
4)接收端套接字利用receive方法接收。

不关闭流。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Send {

    public static void main(String[] args) {
        try {
            DatagramSocket daSend = new DatagramSocket(); //SocketException异常
            DatagramSocket dsRecive = new DatagramSocket(8082);
            Scanner scanner = new Scanner(System.in);
            System.out.println("开始发送:");
            byte[] arrBack = new byte[1024];
            while(true){
                String s = scanner.next();
                byte[] arr = s.getBytes();
                DatagramPacket dpSend = new DatagramPacket(arr, arr.length, InetAddress.getByName("192.168.0.74"), 8089);
                //DatagramPacket dpSend = new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 8080);//SocketException异常

                daSend.send(dpSend);//IOException异常,注:是socket发送包


                DatagramPacket dpBack = new DatagramPacket(arrBack, 1024);
                dsRecive.receive(dpBack);
                byte[] databack = dpBack.getData();//通过getData得到数据
                System.out.println(new String(databack));
                //System.out.println(new String(data,0,dpBack.getLength()));


            }
            //daSend.close();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

接收:
步骤:
1.建立接收端的socket(接收端指定监听端口)和发送端的socket。
2.建立键盘输入对象scanner
3.循环体;
1)建立接收包对象,指定接收到的数据放入的数组,及接收长度
2)接收端套接字利用receive方法接收。
3)建立包对象,指定出入的字节数组以及目的地ip及短裤。
4)发送端套接字利用send方法发送包。

不关闭流。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class Receive {

    public static void main(String[] args) {
        try {
            DatagramSocket dsRecive =new DatagramSocket(8089); //SocketException异常
            DatagramSocket dsSend = new DatagramSocket();
            Scanner sanner = new Scanner(System.in);
            byte[] arr = new byte[1024];
            while(true){

                DatagramPacket dpRecive = new DatagramPacket(arr, 1024);//接收包中参数:接到存入的数组,即存入长度

                dsRecive.receive(dpRecive);//IOException异常

                byte[] data = dpRecive.getData();//通过getData得到arr数组中的数据
                System.out.println(new String(data));
                //System.out.println(new String(data,0,dpRecive.getLength()));
                String back = sanner.next();
                byte[] arrBack = back.getBytes();
                DatagramPacket dpBack = new DatagramPacket(arrBack, arrBack.length,InetAddress.getByName("192.168.0.74"), 8082);
                dsSend.send(dpBack);
            }
            //dsRecive.close();   //关闭的是socket
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

注:
1.由于我用的同一台主机演示,所以端口不能一样。
因为一个客户机来监听,此端口就被占用,其他客户机就不能来监听了。
2.当接收到数据:
System.out.println(new String(data,0,dpBack.getLength()));
用getLength()来获得包中数据长度,这样后面就不会多出空格,
3.要实现多次发送和接收需要用到多线程。
4.接收数据的数组不能建立在循环内,否则浪费空间,在外部,可以每次放数据即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值