当前位置:首页 > Java技术 > JAVA中基于UDP实现多线程通信

JAVA中基于UDP实现多线程通信

2022年11月06日 08:26:54Java技术11

服务器端程序,利用DatagramSocket负责监听端口,当客户端发过来消息时,服务器端就会响应,并将消息内容保存到Datagrampacket对象中,并且!每一次while循环必须重新创建DatagramPacket对象用于保存消息数据。并将socket,packet对象发送给子线程,由子线程完成后面的事务,主线程将进行下一次循环,在receive(packet)处阻塞监听客户端的响应。

package UDPSocketTell;

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

public class UDPServerThreadText {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    DatagramSocket socket = new DatagramSocket(8899);
    byte[] infoBytes = new byte[1024];
    int num = 0;
    System.out.println("服务器端启动了·········");
    while (true) {
        DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length);
        socket.receive(packet);
        UdpServerThread thread = new UdpServerThread(packet, socket, infoBytes);
        thread.start();
        System.out.println(thread);
        System.out.println("访问的客户端数量:" + (num++));
    }
}

}
在子线程中,由传过来的socket和packet对象获取到客户端传过来的消息数据、端口号和InetAddress地址,将消息数据进行输出,并对客户端进行响应。


package UDPSocketTell;

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

public class UdpServerThread extends Thread {
private String info = null;
private DatagramSocket socket = null;
private int port = 0;
private InetAddress address = null;

public UdpServerThread(DatagramPacket packet2, DatagramSocket socket2, byte[] infoBytes2) {
    // TODO Auto-generated constructor stub
    socket = socket2;
    info = new String(infoBytes2, 0, packet2.getLength());
    port = packet2.getPort();
    address = packet2.getAddress();
}

@Override
public void run() {
    // TODO Auto-generated method stub
    super.run();
    System.out.println("客户端说:" + info);
    byte[] infoBytes = "你好!我是服务器~".getBytes();
    DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, port);
    try {
        socket.send(packet);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

客户端代码,只需要用DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, 8899);保存要发送的数据,指出要发送的目标服务器的地址InetAddress,并用socket.send(packet);发出消息即可。新建一个packet对象,使用socket.receive(packet2);接收服务器的响应。

package UDPSocketTell;

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

/**
* 客户端,基于UDP实现Socket通信
*
* @author 杰仔
*
*/
public class UDPclient {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    byte[] infoBytes = "用户名2:吴俊杰;密码2:123456".getBytes();// 创建发送数据的字节数组
    InetAddress address;
    try {
        /*
         * 发送数据包
         */
        address = InetAddress.getByName("127.0.0.1");
        DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, 8899);
        DatagramSocket socket = new DatagramSocket();
        System.out.println("客户端准备发送数据了!");
        socket.send(packet);
        /*
         * 接收数据包响应
         */
        byte[] Bytes = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(Bytes, Bytes.length);
        System.out.println("**********客户端已经启动************");
        socket.receive(packet2);
        String info = new String(Bytes, 0, packet2.getLength());
        System.out.println("自己的packeg的端口号:" + packet.getPort());
        System.out.println("客户端发来消息长度为 " + packet2.getLength() + " 的消息:" + info + "  消息端口号为:" + packet2.getPort());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

欢迎入门学习交流,系统收费0.1,勿在意:
JAVA中基于UDP实现多线程通信 _ JavaClub全栈架构师技术笔记

作者:D_inosaur
来源链接:https://blog.csdn.net/D_inosaur/article/details/62888523

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68135.html

分享给朋友:

“JAVA中基于UDP实现多线程通信” 的相关文章

两年前写的Java基础总结书

两年前写的Java基础总结书

想法衍生 两年前的我,突发奇想,把自己学的Java基础进行规范化的整理,因为自己的文档编辑能力有限,所以写的排版不是很好,参照图书排版的形式,将书籍进行整理,可以供学习Java基础的朋友参考,由于时间有限,可能也会有问题,请指出。下载地址在最后 截图如下:...

java之整数的分解可以理解为倒序输出

Scanner in=new Scanner(System.in); int number ; number=in.nextInt(); int result=0; do{ int diget=number%10;...

Java对象的大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看 下面语句: Object ob = new Ob...

在JAVA 中将堆与栈分开的原因

栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么 放、放在哪儿。 注意:在Java中一个线程就会相应有一个线程栈与之对应 栈因为是运行单位,因此里面存储的信息都是跟...

Java回顾之Spring基础

Java回顾之Spring基础

这是针对Java进行回顾的一系列文章,这篇主要是和Spring基础相关。   第一篇:Java回顾之I/O   第二篇:Java回顾之网络通信   第三篇:Java回顾之多线程   第四篇:Java回顾之多线程同步   第五篇:Java回顾之集...

Java 单例模式详解

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。   单例模式有一下特点:   1、单例类只能有一个实例。   2、单例类必须自己自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。 概念:  jav...

java中equals,hashcode和==的区别

1、== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。  2.引...

Java集合---面试题

HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中,甚至会要求你实现...

Java NIO之Selector(选择器)

Java NIO之Selector(选择器)

历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 超详细的Java...

Java Web系列:Java Web 项目基础

Java Web系列:Java Web 项目基础

1.Java Web 模块结构 JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。Java Web和ASP.NET的核心是分别是Servlet和IHttpHandler接口,因此无论是基础的Page文件(JSP、ASPX)方式还是后来发展的MVC...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。