精华内容
下载资源
问答
  • 2021-02-12 23:15:41

    最近在学Java,正好做一些笔记,以防止自己忘了。

    client端

    //UdpClient.java

    import java.io.IOException;

    import java.io.UnsupportedEncodingException;

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    import java.net.InetSocketAddress;

    import java.net.SocketException;

    public class UdpClient {

    private static DatagramSocket clientSocket = null;

    private InetSocketAddress serverAddress = null;

    public UdpClient(String host, int port) throws SocketException {

    clientSocket = new DatagramSocket( ); //创建socket

    serverAddress = new InetSocketAddress(host, port); //绑定sever的ip与port

    }

    public void send(String msg) throws IOException {

    try {

    byte[] data = msg.getBytes("utf-8");

    DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress);

    clientSocket.send(packet);

    } catch (UnsupportedEncodingException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    //main方法用于测试

    public static void main(String[] args) throws Exception {

    UdpClient client = new UdpClient("127.0.0.1", 14586);

    client.send("hello world");

    clientSocket.close();

    }

    }

    server端

    //UdpServer.java

    import java.io.IOException;

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    import java.net.SocketException;

    public class UdpServer {

    private byte[] data = new byte[1024];

    private static DatagramSocket serverSocket = null;

    private DatagramPacket packet = null;

    public UdpServer(int port) throws SocketException {

    serverSocket = new DatagramSocket(port);

    System.out.println("sever start!");

    }

    //接收消息

    public String recieve() throws IOException {

    packet = new DatagramPacket(data, data.length);

    serverSocket.receive(packet);

    String info = new String(packet.getData(), 0, packet.getLength());

    System.out.println("recieve message from " + packet.getAddress().getHostAddress()

    + ":" + packet.getPort() + "\t"+ info);

    return info;

    }

    //本地测试

    public static void main(String[] args) throws Exception {

    UdpServer server = new UdpServer(14586);

    server.recieve();

    }

    }

    打印结果

    sever start!

    recieve message from 127.0.0.1:64478 hello world

    更多相关内容
  • .java 文件可以拷贝出去使用,根据具体情况设置目标端口号和目标IP 直接使用Retransmission.java,在文件目录下打开命令行,输入: javac Retransmission.java java Retransmission 亦可以将工程导入eclipse中运行
  • linux下运行客户端 和服务端后,在服务端可以设置字符串转化模式,根据相应模式将客户端发来的字符串进行转化,并转发回客户端。
  • 项目总结22:Java UDP Socket数据的发送和接收1-先上demo客户端(发送数据)packagecom.hs.pretest.udp;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net....

    项目总结22:Java UDP Socket数据的发送和接收

    1-先上demo

    客户端(发送数据)

    packagecom.hs.pretest.udp;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;public classUDPClient {/*** @description:数据发送方

    *@param:[args]

    *@return:void

    * @date:2019/4/29

    *@author:tangyj

    * @remark:

    **/

    public static voidmain(String[] args) {try{

    DatagramSocket socket= newDatagramSocket();

    String s= "这是测试数据";byte[] buffer =s.getBytes();

    DatagramPacket packet= new DatagramPacket(buffer, buffer.length, InetAddress.getByName("127.0.0.1"),10000);

    socket.send(packet);

    socket.close();

    }catch(SocketException e) {

    e.printStackTrace();

    }catch(IOException e) {

    e.printStackTrace();

    }

    }

    }

    服务端(接收数据)

    package com.hs.pretest.udp;

    import java.io.IOException;

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    import java.net.SocketException;

    public class UDPServer {

    /**

    * @description:数据接收方

    * @param:[args]

    * @return:void

    * @date:2019/4/29

    * @author:tangyj

    * @remark:

    * */

    public static void main(String[] args) {

    try {

    DatagramSocket socket = new DatagramSocket(10000);

    byte[] buffer = new byte[65508];

    DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

    while(true){

    socket.receive(packet);

    String s = new String(packet.getData(),0,packet.getLength());

    System.out.println(s);

    }

    } catch (SocketException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    2-操作流程

    先启动服务端(服务端启动后,会一直处于响应状态);在启动客户端main方法,客户端每启动一次,服务端就会收到一次数据

    3-DatagramSocket

    Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。

    4-什么是UDP

    UDP协议:全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

    UDP协议的特点:

    (1)UDP无需建立连接。因此UDP不会引入建立连接的时延。试想如果DNS运行在TCP之上而不是UDP,则DNS的速度会满很多。HTTP使用TCP而不是UDP,是因为基于文本数据的Web网页来说,可靠性是至关重要的。

    什么是DNS? DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。

    (2)无连接状态。TCP需要在端系统中维护连接状态。此连接状态包括接受和发送缓存、拥塞控制参数和确认号和序号的参数。而UDP不维护连接状态,也不跟踪这些参数,因此某些专用应用服务器使用UDP时,一般都能支持更多的活动客户机。

    (3)分组首部开销更小。TCP有20字节的的首部开销,而UDP只有8个字节的首部开销。

    (4)应用层能够更地控制要发送的数据和发送时间。UDP没有拥塞控制,因此网络中的拥塞也不会影响主机的发送效率。某些实时应用(如直播)要求以稳定的速度发送,能容忍一些数据的丢失,但不允许有较大的时延,而UDP正好可以满足这些应用的需求。

    (5)UDP常用于一次性传输比较小数据的网络应用,如DNS、SNMP等,因为对于这些应用,若采用TCP,则将为创建连接、维护和拆除而带来不小的开销。UDP也常用于多媒体应用(如IP电话、实时视频会议、流媒体等),显然,可靠数据传输对于这些应用来说并不是最重要的,但TCP的拥塞控制会导致数据出现较大的延迟,这是它们不可容忍的。

    (6)UDP提供尽最大努力的交付,即不保证可靠交付,但并不意味着应用对数据的要求是不可靠的,因此需要维护传输可靠性的工作需要用户在应用层来完成。应用实体可以根据应用需求来灵活设计自己的可靠性机制。

    (7)UDP是面向报文的的。发送方UDP对应用层交下来的报文,在添加首部后就交付给IP层,既不合并,也不拆分,而是保留这些报文的边界;接受方UDP对IP层交上来的用户数据报,在去除首部后就原封不动的交付给上层的应用进程,一次交付一个完整的报文,因此报文不可分割,是UDP数据处理的最小单位。

    展开全文
  • Java实现UDP互发消息

    2021-02-26 09:54:47
    本文实例为大家分享了Java实现UDP互发消息的具体代码,供大家参考,具体内容如下UDP的发送端package udp;/**UDP发送端*/import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket...

    本文实例为大家分享了Java实现UDP互发消息的具体代码,供大家参考,具体内容如下

    UDP的发送端

    package udp;

    /**

    UDP发送端

    */

    import java.io.IOException;

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    import java.net.InetSocketAddress;

    public class UdpClient {

    public static void main(String[] args) throws IOException {

    System.out.println("发送方启动中......");

    //使用DatagramSocket指定端口,创建发送端

    DatagramSocket client = new DatagramSocket(8888);

    //准备数据,转换为字节数组

    String data ="帅哥";

    byte[] datas = data.getBytes();

    //封装成DatagramPacket包裹,需要指定目的地

    DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));

    //发送包裹send(DatagramPacket p)

    client.send(packet);

    //释放资源

    client.close();

    }

    }

    UDP的接收端

    package udp;

    /**

    UDP接收端

    */

    import java.io.IOException;

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    public class UdpServer {

    public static void main(String[] args) throws IOException {

    System.out.println("接收方启动中......");

    //使用DatagramSocket指定端口创建接收端,端口值要与客户端的发送包裹一致

    DatagramSocket server =new DatagramSocket(9999);

    //准备容器封装成DatagramPacket包裹

    byte[] container = new byte[1024*60];

    DatagramPacket packet = new DatagramPacket(container,0,container.length);

    //阻塞式

    server.receive(packet);

    byte[] datas = packet.getData();

    int len=packet.getLength();

    System.out.println(new String(datas,0,len));

    server.close();

    }

    }

    注意:在Intellij idea中运行时,要先把两个端的平行运行设置打开,不然每次只能打开发送端或者接收端,不能同时打开,具体操作如下:

    195c4f44f703f23a0285e628bd3c521a.png

    934f9fb3e3a355ac04fd7ca40b198ec2.png

    最后,运行结果如下:

    53f122cf961bfa32c0e8951410b55b4d.png

    5cc46c2b77231509ef548c08476d3075.png

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 然后通过udp协议先服务器发送消息,然后服务器在通过udp转发在各个客服端。这个是不是 观察者模式server代码public class Server {private static LinkedList list=new LinkedList();private static final E...

    场景很简单,就是多个客户端通过udp,连接到服务器(其实是无连接的,就是服务器保存了客户端的ip信息)。然后通过udp协议先服务器发送消息,然后服务器在通过udp转发在各个客服端。

    这个是不是 观察者模式

    server代码

    public class Server {

    private static LinkedList list=new LinkedList();

    private static final ExecutorService executorService = Executors.newFixedThreadPool(4);//这里用多线程去转发,可以提高效率。emmm,udp没有3次握手,速度应该很快,多不多线程应该差不了太多

    private static DatagramChannel server=null;

    private static Selector selector=null;

    static {

    try{

    server=DatagramChannel.open().bind(new InetSocketAddress(8889));

    server.configureBlocking(false);

    selector=Selector.open();

    }catch (Exception e){

    e.printStackTrace();

    }

    }

    public static void main(String[] args)throws Exception {

    server.register(selector, SelectionKey.OP_READ);

    while (true){

    if (selector.select()>0){

    Set keys = selector.selectedKeys();

    Iterator iterator = keys.iterator();

    while (iterator.hasNext()){

    SelectionKey selectionKey = iterator.next();

    if (selectionKey.isReadable()){

    String msg = readMsg(selectionKey);

    broadcast(msg);

    }

    iterator.remove();

    }}

    }

    }

    public static void saveIP(SocketAddress address)throws Exception{

    if (!list.contains(address)){

    list.add(address);

    System.out.println("新增ip:"+address);

    }

    System.out.println("当前udp 保存的ip数量:"+list.size());

    }

    public static void broadcast(String msg) throws Exception{

    //DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length);

    for (SocketAddress address:list

    ) {

    ByteBuffer byteBuffer=ByteBuffer.wrap(msg.getBytes());

    executorService.submit(new Runnable() {

    @Override

    public void run() {

    try{

    server.send(byteBuffer, address);

    System.out.println(Thread.currentThread().getName()+":"+address+"发送成功");

    }catch (Exception e){

    System.out.println(Thread.currentThread().getName()+":"+address+"发送失败");

    }

    }

    });

    }

    }

    public static String readMsg(SelectionKey selectionKey)throws Exception{

    DatagramChannel channel=(DatagramChannel)selectionKey.channel();

    System.out.println(channel.getRemoteAddress()+":"+channel.getLocalAddress());

    ByteBuffer byteBuffer=ByteBuffer.allocate(1024);

    SocketAddress receive = channel.receive(byteBuffer);

    saveIP(receive);

    byteBuffer.flip();

    String msg=new String(byteBuffer.array(),"utf-8");

    System.out.println("收到消息:"+msg);

    return msg;

    }

    }

    client 代码

    public class Client {

    public static DatagramSocket socket=null;

    public static void main(String[] args) throws Exception{

    try {

    socket=new DatagramSocket();

    Scanner scanner=new Scanner(System.in);

    String msg;

    new Thread(()->{

    try{

    while (true){

    byte[] arr=new byte[1024];

    DatagramPacket packet=new DatagramPacket(arr,arr.length);

    socket.receive(packet);

    String m1=new String(packet.getData(),"utf-8");

    System.out.println("受到服务器消息:"+m1);

    }

    }catch (Exception e){

    e.printStackTrace();

    }

    }).start();

    while (!(msg=scanner.nextLine()).equals("exit")){

    DatagramPacket packet=new DatagramPacket(msg.getBytes(),msg.getBytes().length,new InetSocketAddress("127.0.0.1",8889));

    socket.send(packet);

    }

    }finally {

    socket.close();

    }

    }

    }

    展开全文
  • 发短信:不用连接,但需要知道对方的地址,客户端、服务端没有明确的...import java.net.datagrampacket;import java.net.datagramsocket;import java.net.inetaddress;/*** 发送端*/public class udpclientdemo1 {p...
  • Java网络编程之UDP
  • java UDP报文的发送与接收

    热门讨论 2010-06-21 16:49:29
    java UDP报文的发送与接收 java UDP报文的发送与接收 java UDP报文的发送与接收
  • JAVA实现UDP反向代理

    千次阅读 2017-11-12 16:22:48
    JAVA实现TCP协议的反向代理非常容易,只用不到100行代码就能搞定,只需两个Socket,3条线程,进行输入流与输出流之间互相读写就可以了,可以承载所有TCP协议层以上的流量,比如HTTP(s),FTP,sFTP,邮件,即时通讯...
  • JAVA 端口转发 端口映 射源码 jPortMap JAVA实现网络端口转发/端口映射功能
  • java UDP传输

    2021-02-12 14:23:30
    直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象...
  • 本文实例为大家分享了java利用udp实现发送数据的具体代码,供大家参考,具体内容如下1.udp的特点数据以包的形式发送数据udp是面向无连接的udp会丢失数据,是一种不安全的连接udp的传输速度较快2.发送端package ...
  • UDP接收和转发.zip

    2021-04-07 22:34:10
    支持UDP接收数据同时将接收到的数据转发到指定地址和端口; outip:127.0.0.1 outport:7777 inport:8888
  • import java.io.IOException; import java.net.*; public class SocketUDPClient { private InetAddress ip; private int port; private DatagramSocket socket; public SocketUDPClient(String ip, int port
  • 本文主要是java网络编程中的udp服务器和客户机工作原理。
  • Java中的UDP通信 UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念 Java提供...
  • Netty数据转发工具

    2021-04-13 16:59:14
    Netty实现端口数据转发:3000进4000出
  • 今天来实现一个UDP发送消息的代码,本次只写了发送端发送,接收端接受,没有实现双向 来看一下发送端 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import ...
  • SCANFISH-II 型声呐系统数据接口协议,对接tcp转发app,json封装
  • Java实现UDP通信

    2020-11-01 04:15:57
    要让 UDP 数可靠的传送数据,最直接的办法是模拟 tcp 协议的实现,对 UDP 进行 简单的差错重传控制。 我们设定基本的控制规则如下: 1.c 向 s 发送一个数据包,如果 s 收到,必须在 3 秒之内回送一个应答包;发送的...
  • JAVA使用UDP发送中文字符乱码问题

    千次阅读 2020-04-02 00:55:01
    Java写了个UDP收发程序,发现中文有问题! package socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net....
  • UDP协议: 用户数据报协议(User Datagram Protocol) UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一个台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否...
  • 学习使用Java开发语言做计算机音频数据采集、压缩、转发功能,从而实现双向通话功能。采集数据频率为8KHz、16bit、单通道、小端格式,数据转发采用G711A压缩传输。 二、音频采样率 1. 参考百度百科 为了测试语音通话...
  • Java UDP编程实例

    2021-02-12 10:07:18
    本篇文从以下几点来实现并演示一个使用UDP协议进行通信的示例。1.什么是UDP 2.UDP在网络中是怎样实现通信的 3.UDP的特点及常见的应用场景 4.代码示例 首先来看什么是UDPUDP 是User Datagram Protocol的简称, 中文名...
  • C# TCPIP/UDP转发

    2016-02-15 14:02:47
    C# TCPIP/UDP转发C# TCPIP/UDP转发C# TCPIP/UDP转发C# TCPIP/UDP转发C# TCPIP/UDP转发
  • Java UDP 数据报

    2021-02-12 20:21:41
    服务端,创建一个DatagramSocket...收到客户端发来的信息后,有原封不动转发到客户端。public class DatagramServerTest {public static void main(String[] args) throws IOException {byte[] buf = new byte[1024...
  • 文章目录介绍测试用例 客户端使用UDP发送字符串服务端客户端Datagram Packet类中常用API的使用测试用例 使用上述API发送数据UDP单播 介绍 在使用UDP实现Socket通信时,服务端与客户端都是使用DatagramSocket类,传输...
  • 程序是通了,但是没法转发,获取不到对方ip。nio中 udp使用的是DatagramChannel ,但是SelectorKey.channel()转化之后的DatagramChannel,调用getRemoteAddress()获取不到对方的ip信息。看了下java docA selectable ...
  • 使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,991
精华内容 7,996
关键字:

java udp 转发

java 订阅