我是靠谱客的博主 有魅力保温杯,最近开发中收集的这篇文章主要介绍网络编程之UDP-------网页聊天是怎样实现的单向通信双向通信UDP的具体实现-----,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

话不多说看代码----

UDP的实现

  • 单向通信
  • 双向通信
  • UDP的具体实现-----
    • 类的基本信息
      • UDP传输的特点----
    • 类的基本方法
      • 类的构造方法
      • 类的常用方法----

单向通信

写一个学生端----


import java.io.IOException;
import java.net.*;


/**
 * @author : Gavin
 * @date: 2021/8/20 - 08 - 20 - 10:39
 * @Description: IpTest
 * @version: 1.0
 */
public class StudentSend {
    public static void main(String[] args) {
        System.out.println("學生登陸---");
        DatagramSocket dgs=null;
        InetAddress localhost =null;
        try {
            dgs=new DatagramSocket(8888);//准备好了端口号
           String str= "HELLOWORLD!";//准备数据包
            byte[]b=str.getBytes();
            //开始发送
           localhost= InetAddress.getByName("localhost");
            //向localhost:9999发送数据
                DatagramPacket dp= new DatagramPacket(b,b.length, localhost,9999);
         dgs.send(dp);
         dgs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

再写一个老师端–


import java.io.IOException;
import java.net.*;

/**
 * @author : Gavin
 * @date: 2021/8/20 - 08 - 20 - 10:39
 * @Description: IpTest
 * @version: 1.0
 */
public class TeacherReceive {
    public static void main(String[] args) {
System.out.println("老师上线了");
        DatagramSocket  dgs=null;
        InetAddress localhost= null;

        try {
            //老师在9999端口接收学生在8888端口发送的数据
            dgs= new DatagramSocket(9999);
            //开辟一个空包用于接收数据
            byte b[]= new byte[1024];
            //接收数据的准备工作
            localhost=InetAddress.getByName("localhost");
            //准备接收localhost:8888发来的数据
            DatagramPacket dp= new DatagramPacket(b,b.length,localhost,8888);
            //接收完毕---取出内容
            dgs.receive(dp);

            byte data[]=dp.getData();
            String str= new String(data,0,dp.getLength());
            System.out.println(str);
            dgs.close();

        } catch (SocketException | UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果如下----

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
老师上线了
HELLOWORLD!

双向通信


import java.io.IOException;
import java.net.*;


/**
 * @author : Gavin
 * @date: 2021/8/20 - 08 - 20 - 10:39
 * @Description: IpTest
 * @version: 1.0
 */
public class StudentSend {
    public static void main(String[] args) {
        System.out.println("学生上线了");

        DatagramSocket dgs=null;
        DatagramPacket dgp=null;
            try {
            //开启学生端---指定为8888端口
            dgs=  new DatagramSocket(8888);
            //准备要发送的数据
            String stuData="Hello Teacher";
            //发送数据前的准备---将要发送的数据包装成字节数组
            byte []bytes= stuData.getBytes();
            //发送数据前的准备--要发往的地址
            InetAddress localhost = InetAddress.getByName("localhost");
            //打包数据--往localhost:9999端口发送数据
            dgp=new DatagramPacket(bytes,bytes.length,localhost,9999);
           //发送数据
            dgs.send(dgp);

            //接收教师端返回的数据
                try {
                    Thread.sleep(10);//模拟网络延迟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //接收数据前的准备工作---开辟空间
            byte teaData[]= new byte[1024];

              //接收数据并打包
              dgp=new DatagramPacket(teaData,teaData.length,localhost,9999);
             //接收的动作
              dgs.receive(dgp);
                //打包数据
              teaData=dgp.getData();
              //取出数据
                String str= new String(teaData,0,dgp.getLength());
                System.out.println("老师端返回的数据--"+str);
            } catch (SocketException | UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
            }
            finally{
                dgs.close();
            }
    }
}


import java.io.IOException;
import java.net.*;

/**
 * @author : Gavin
 * @date: 2021/8/20 - 08 - 20 - 10:39
 * @Description: IpTest
 * @version: 1.0
 */
public class TeacherReceive {
    public static void main(String[] args) {
System.out.println("老师一直在线....");
DatagramSocket dgs=null;
DatagramPacket dgp=null;
try {
	//开辟老师端
	dgs= new DatagramSocket(9999);
	//接收数据前的准备--开辟空间用于接收数据
	byte[]data= new byte[1024];
	//接收的数据来自于哪里?
	InetAddress localhost=InetAddress.getByName("localhost");
	//准备接收数据---来自于学生端localhost:8888端口
	dgp= new DatagramPacket(data,data.length,localhost,8888);
	//接收数据并打包
	dgs.receive(dgp);
	//取出实际的数据长度
	data=dgp.getData();
	String str= new String (data,0,dgp.getLength());
	
	System.out.println("学生发送的数据---"+str);
	
	//准备向学生端反馈数据
	
	//准备要发送的数据
	String teaData="Hello Student";
	//发送数据前的准备---将要发送的数据包装成字节数组
    byte []bytes= teaData.getBytes();
   
   
    //打包数据--往localhost2:8888端口发送数据
    dgp=new DatagramPacket(bytes,bytes.length,localhost,8888);
   //发送数据
    dgs.send(dgp);
	
} catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
finally {
	dgs.close();
}
    }
}

在这里插入图片描述

UDP的具体实现-----

写完之后再看具体的知识点-----

类的基本信息

public class DatagramSocket extends Object implements Closeable
此类表示用于发送和接收数据报数据包的套接字。

数据报套接字是分组传送服务的发送或接收点。 在数据报套接字上发送或接收的每个数据包都被单独寻址和路由。
从一个机器发送到另一个机器的多个分组可以不同地路由,并且可以以任何顺序到达。

UDP传输的特点----

从描述上可以发现UDP传输时的特点:

1,分组传送和接收;
2,可以以任何顺序到达----信息发送和接收的顺序可能出现不一致的额请跨国即传输是不可靠的;
3,可以分组分别将信息发送给不同的设备----即是优点也是缺点;

类的基本方法

类的构造方法

DatagramSocket()
构造数据报套接字并将其绑定到本地主机上的任何可用端口。

protected DatagramSocket(DatagramSocketImpl impl)
使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。

DatagramSocket(int port)
构造数据报套接字并将其绑定到本地主机上的指定端口。

DatagramSocket(int port, InetAddress laddr)
创建一个数据报套接字,绑定到指定的本地地址。

DatagramSocket(SocketAddress bindaddr)
创建一个数据报套接字,绑定到指定的本地套接字地址。

DatagramSocket s = new DatagramSocket(); 
s.bind(new InetSocketAddress(8888));

DatagramSocket s1 = new DatagramSocket(8888);
//这两种情况都将创建一个DatagramSocket,可以在UDP端口8888上接收广播

类的常用方法----

void bind(SocketAddress addr)
将此DatagramSocket绑定到特定的地址和端口。

void close()
关闭此数据报套接字。
在这里插入图片描述

InetAddress getInetAddress()
返回此套接字连接到的地址。

InetAddress getLocalAddress()
获取套接字所绑定的本地地址。

int getLocalPort()
返回此套接字绑定到的本地主机上的端口号。

SocketAddress getLocalSocketAddress()
返回此套接字绑定到的端点的地址。

int getPort()
返回此套接字连接到的端口号。

boolean isBound()
返回套接字的绑定状态。

boolean isClosed()
返回套接字是否关闭。

boolean isConnected()
返回套接字的连接状态。

void receive(DatagramPacket p)
从此套接字接收数据报包。
在这里插入图片描述

void send(DatagramPacket p)
从此套接字发送数据报包。
在这里插入图片描述

最后

以上就是有魅力保温杯为你收集整理的网络编程之UDP-------网页聊天是怎样实现的单向通信双向通信UDP的具体实现-----的全部内容,希望文章能够帮你解决网络编程之UDP-------网页聊天是怎样实现的单向通信双向通信UDP的具体实现-----所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部