JAVA学习之基于UDP的通信

UDP是不需要连接的通信协议,需要两个端:发送端和接收端。UDP通信可以使用DatagramSocket的send和receive方法。下面通过代码实现UDP发送端和接收端互通。

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

public class ChatTest {
    public static void main(String[] args) throws SocketException {
        /* 通过UDP协议完成一个聊天程序
         * 一个负责发送。一个负责接收。同时进行,多线程
         * */
        DatagramSocket send=new DatagramSocket();//DatagramSocket 表示是用来发送和接收数据报包的套接字。
        DatagramSocket rece=new DatagramSocket(10062);      
        new Thread(new Send(send)).start();
        new Thread(new Receive(rece)).start();
    }
} 
class Receive implements Runnable{
    private DatagramSocket ds;          
    public Receive(DatagramSocket ds) {
        super();
        this.ds = ds;
        }

    public void run(){
        while(true){
            //创建接收的数据包
            byte[] buf=new byte[1024];
            DatagramPacket dp=new DatagramPacket(buf,buf.length);//DatagramPacket表示数据报包。数据报包用来实现无连接包投递服务。
            //接收
            try {
                ds.receive(dp);
                System.out.println("接收了");
             } catch (IOException e) {
                e.printStackTrace();
            }
            //获取数据
            String ip=dp.getAddress().getHostAddress();//getHostAddress():返回 IP 地址字符串(以文本表现形式)。
            String data = new String(dp.getData(),0,dp.getLength());
            if("over".equals(data)){
                System.out.println("离开聊天室");
            }
               System.out.println(ip+":"+data); 
            }
            }
        }
class Send implements Runnable{
    private DatagramSocket ds;
    public Send(DatagramSocket ds) {
        super();
        this.ds = ds;
    }
    public void run(){
       System.out.println("发送端启动");
       //键盘录入
       BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));//?
       //读取数据
        String line = null;
        try {   
           while((line=buffer.readLine())!=null){
           //将数据变成字节数组,封装到数据包中
            //将录入的数据封装到数据包中
            byte[] buf = line.getBytes();
            DatagramPacket dp=new      
            DatagramPacket(buf,buf.length,InetAddress.getByName("10.104.4.196"),10062);
            ds.send(dp);
            System.out.println("发送结束");
            if("over".equals(line)){
                break;
            }
        }
            ds.close();
        } catch (UnknownHostException e) {
                e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值