java中的简单Udp通讯程序

前言

原创文章欢迎转载,请保留出处。
若有任何疑问建议,欢迎回复。
邮箱:[email protected]

本人学习java中的socket练手的小程序,高手请飘过,仅作为学习笔记,没有技术含量。


分析

这里使用两个独立线程负责发包和收包,设计两个类实现Runnable接口,利用管道和主窗体通信。


代码

mainfest.txt文件这里注意有myqq.MyQQ后的回车符和myqq.MyQQ前的空格

Main-Class: myqq.MyQQ

MyQQ.java文件

package myqq;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

class UdpSend implements Runnable
{
    private DatagramSocket ds;
    private InputStream is;
    public UdpSend(DatagramSocket ds,InputStream is)
    {
        try
        {
            this.ds = ds;
            this.is = is;
        }
        catch (Exception e)
        {
            throw new RuntimeException("发送端错误");
        }
    }
    public void run()
    {
        try
        {
            //读取来自文本框的数据
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            String s = null;
            while((s=br.readLine())!=null)
            {
                //当输入886时停止发送数据
                if("886".equals(s))
                    break;

                byte[] buf  = s.getBytes();

                //这里是要发送数据包的目标ip和端口,也可以设置成广播地址
                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.255.255"),12345);
                ds.send(dp);
            }
            br.close();

            ds.close();
        }
        catch (Exception e)
        {
            throw new RuntimeException("发送端错误");
        }

    }
}

class UdpRecv implements Runnable
{
    private DatagramSocket ds;
    private OutputStream is;

    public UdpRecv(DatagramSocket ds,OutputStream is)
    {
        try
        {
            this.ds = ds;
            this.is = is;
        }
        catch (Exception e)
        {
            throw new RuntimeException("接收端错误");
        }
    }

    public void run()
    {
        try
        {
            while(true)
            {
                //Udp最大的数据包长度是64k
                byte[] buf = new byte[1024*64];

                DatagramPacket dp = new DatagramPacket(buf,buf.length);

                ds.receive(dp);

                //获取数据包的源ip和数据内容
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(),0,dp.getLength());

                String s = ip+"::"+data;

                is.write(s.getBytes());
                is.flush();
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException("接收端错误");
        }

    }
}

class MyQQ
{
    private static Frame r;
    private static TextArea tsend;//发送文本框
    private static TextArea trecv;//接收文本框

    //发送通信管道
    private static PipedInputStream sis;
    private static PipedOutputStream sos;

    //接收通信管道
    private static PipedInputStream ris;
    private static PipedOutputStream ros;

    public static void main(String[] args) throws Exception
    {
        DatagramSocket sendds = new DatagramSocket();
        DatagramSocket recvds = new DatagramSocket(12345);//监听的端口

        sis = new PipedInputStream();
        sos = new PipedOutputStream();
        sis.connect(sos);

        ris = new PipedInputStream();
        ros = new PipedOutputStream();
        ris.connect(ros);

        //启动发送和接收线程
        new Thread(new UdpRecv(recvds,ros)).start();
        new Thread(new UdpSend(sendds,sis)).start();

        System.out.println("Hello MyQWQ!");

        init();

        while(true)
        {
            byte[] buf = new byte[1024];
            int len = ris.read(buf);

            trecv.append(new String(buf,0,len)+"\r\n");
        }

    }

    public static void init() throws IOException
    {
        r = new Frame("MyQQ");

        trecv = new TextArea("",20,50,TextArea.SCROLLBARS_VERTICAL_ONLY);
        tsend = new TextArea("",13,50,TextArea.SCROLLBARS_VERTICAL_ONLY);

        r.setBounds(400,100,400,600);
        r.setLayout(new FlowLayout());

        r.add(trecv);
        r.add(tsend);

        //Frame事件
        event();

        r.setVisible(true);

        //设置输入框为当前焦点
        trecv.transferFocus();

    }

    public static void event()
    {
        r.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });

        tsend.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode()==KeyEvent.VK_ENTER)//回车键发送数据
                {
                    e.consume();
                    try
                    {
                        sos.write((tsend.getText()+"\r\n").getBytes());
                        sos.flush();
                        //System.out.println(tsend.getText());
                    }
                    catch (Exception ex)
                    {
                        throw new RuntimeException("IO错误");
                    }
                    tsend.setText("");
                }
            }
        });
    }
}


编译和打包

到文件目录下编译,也可以使用IDE建工程

javac -d . MyQQ.java
jar cvfm myqq.jar mainfest.txt myqq

运行效果

直接运行打包的myqq.jar:(由于只有一台电脑,地址写的是广播地址,能收到证明程序成功发出并收到包)

时间: 2024-12-21 07:58:19

java中的简单Udp通讯程序的相关文章

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

Java中的简单工厂模式

举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色. 2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象的人是最早只存在于女娲的头

Java中的简单工厂模式(转)

Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色. 2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象

java中最简单的计算执行时长的方式

日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.util.*;包 exceFun(); long endL= new Date().getTime(); //执行时间 System.out.println("startL:"+senStrat +" endL:"+senEndL +" 执行时长:"

JAVA中TCP和UDP传输例子的对比

在本文中我将学到的java中的UDP和TCP在局域网内的传输做了对比,这里强调 的是局域网范围内,非广域网.首先,下面的是我写的在局域网内利用java中的UDP协议写的一个传输文件或者图片的类. --------------------------------------------------------------------------------------------------------------------------------------------------------

Java中的TCP/UDP网络通信编程

127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口. 网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议. Socket连接套接字,

[学习笔记]Java网络编程之UDP通讯

1. 体系结构 计算机网络各层及其协议的集合,称为网络的体系结构.目前公认的计算机网络体系结构有概念清楚理论完善的OSI七层协议结构和实际上广泛应用的TCP/IP四层体系结构. 2. 各层概述 应用层:直接为用户的程序提供服务,如支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等. 运输层:负责向两个主机中进程之间的通信提供服务,主要使用面向连接的TCP协议和无连接的UDP协议. 网络层:负责为分组交换网上不同主机提供地址交付的通信服务,该层使用IP协议,所以在该层传送的数据称之为IP数

JAVA中SSL证书认证通讯

SSL通讯服务端 /******************************************************************** * 项目名称    :rochoc   <p> * 包名称      :rochoc.net.security <p> * 文件名称    :SSLServer   <p> * 编写者     :luoc    <p> * 编写日期    :2005-6-30    <p> * 程序功能(类

java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)

在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 1 /* 2 * 这个例子用来解释多个生产者和多个消费者的情况 3 */ 4 5 /* 6 * 资源库 7 */ 8 class Resource 9 { 10 private String name; 11 private int count = 1; 12 private boolean flag = fals