jave中的udp套接字,接收方未收到消息 [英] udp socket in jave , the receiver not receive message

查看:118
本文介绍了jave中的udp套接字,接收方未收到消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我使用此代码时,发送方成功地通过接收方无法收到此消息来发送消息

  package  UDP_Socket;

导入 java.net.*;
导入 java.io. *;

公共  PacketReceiver {
    公共 静态  void  main(字符串 [] args){
        尝试 {
            
              
// 创建一个数据报套接字,该套接字绑定到特定的端口9999 
            DatagramSocket socket =  DatagramSocket( 9999 );
// 创建一个数据报包,其中包含最大256个字节的缓冲区
            DatagramPacket封包=  DatagramPacket(  byte  [ 256 ], 256 );
// 接收数据包-默认情况下,这是一项阻止操作
            //  socket.setSoTimeout(10000); 
            socket.receive(packet);
            System.out.println(" );
// 显示数据包信息
            InetAddress remote_addr = packet.getAddress();
            System.out.println("  + remote_addr.getHostAddress());
            System.out.println("  + packet.getPort());
// 通过读取字节数组来显示数据包内容
            ByteArrayInputStream bin =  ByteArrayInputStream(packet.getData());
// 仅显示不超过原始UDP数据包的长度
             for ( int  i =  0 ; i < packet.getLength(); i ++){
                 int  data = bin.read();
                如果(数据==- 1 )
                     break ;
                其他
                    System.out.print(( char )data);
            }
            socket.close();
        } 捕获(IOException ioe){
            System.err.println("  + ioe);
        }
    }
} 




  package  UDP_Socket;

导入 java.net.*;
导入 java.io. *;

公共  PacketSender {
    公共 静态  void  main(字符串 [] args){

        尝试 {
// 远程服务器的主机名/IP地址
            字符串主机名= " ;
// 查找指定的主机名,并获取一个InetAddress 
            System.out.println("  +主机名)";
            InetAddress remote_addr = InetAddress.getByName(hostname);
            System.out.println("  + remote_addr.getHostAddress());;
// 创建绑定到任何可用本地端口的数据报套接字
            DatagramSocket socket =  DatagramSocket();
// 创建一条消息,以使用UDP数据包发送
            ByteArrayOutputStream bout =  ByteArrayOutputStream();
            PrintStream pout =  PrintStream(bout);
            pout.print(" );
// 以字节数组的形式获取消息的内容
            字节 [] barray = bout.toByteArray();
// 创建一个数据报包,其中包含我们的字节数组
            DatagramPacket封包=  DatagramPacket(barray,barray.length);
// 设置数据包的目标地址
            packet.setAddress(remote_addr);
// 将端口号设置为9999 
            packet.setPort( 9999 );
// 发送数据包-请记住,不能保证交货
            socket.send(packet);
            System.out.println(" );
            socket.close();
        } 捕获(UnknownHostException,呵呵){
            System.err.println("  + uhe.getMessage());
        } 捕获(IOException ioe){
            System.err.println("  + ioe);
        }
    }
} 

解决方案

首先,您应该尝试另一个套接字. 0-10000套接字经常由不同的应用程序使用,在这里使用更高的值会节省很多(并且请不要再使用33333或22222,并且...您知道哪个...)

我也可以建议阅读有关数据报的Java教程 [package UDP_Socket; import java.net.*; import java.io.*; public class PacketReceiver { public static void main(String[] args) { try { // Create a datagram socket, bound to the specific port 9999 DatagramSocket socket = new DatagramSocket(9999); // Create a datagram packet, containing a maximum buffer of 256 bytes DatagramPacket packet = new DatagramPacket(new byte[256], 256); // Receive a packet - remember by default this is a blocking operation //socket.setSoTimeout(10000); socket.receive(packet); System.out.println("Packet received!"); // Display packet information InetAddress remote_addr = packet.getAddress(); System.out.println("Sent by host: " + remote_addr.getHostAddress()); System.out.println("Sent from port: " + packet.getPort()); // Display packet contents, by reading from byte array ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData()); // Display only up to the length of the original UDP packet for (int i = 0; i < packet.getLength(); i++) { int data = bin.read(); if (data == -1) break; else System.out.print((char)data); } socket.close(); } catch (IOException ioe) { System.err.println("Error - " + ioe); } } }




package UDP_Socket;

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

public class PacketSender {
    public static void main(String[] args) {

        try {
// Hostname/IP address of the remote server  
            String hostname = "localhost";
// Lookup the specified hostname, and get an InetAddress
            System.out.println("Looking up hostname " + hostname);
            InetAddress remote_addr = InetAddress.getByName(hostname);
            System.out.println("Hostname resolved as " + remote_addr.getHostAddress());
// Create a datagram socket, bound to any available local port
            DatagramSocket socket = new DatagramSocket();
// Create a message to send using a UDP packet
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            PrintStream pout = new PrintStream(bout);
            pout.print("Greetings!");
// Get the contents of our message as an array of bytes
            byte[] barray = bout.toByteArray();
// Create a datagram packet, containing our byte array
            DatagramPacket packet = new DatagramPacket(barray, barray.length);
// Set the destination address of the packet 
            packet.setAddress(remote_addr);
// Set port number to 9999
            packet.setPort(9999);
// Send the packet - remember no guarantee of delivery
            socket.send(packet);
            System.out.println("Packet sent!");
            socket.close();
        } catch (UnknownHostException uhe) {
            System.err.println("Can't find host " + uhe.getMessage());
        } catch (IOException ioe) {
            System.err.println("Error - " + ioe);
        }
    }
}

解决方案

First of all you should try another socket. the sockets 0-10000 are often used by different applications, it''s much saver to use a higher value here (and please not again 33333 or 22222 and... you know which...)

Also can I recommend to read
This Java Tutorial on Datagrams[^].


这篇关于jave中的udp套接字,接收方未收到消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆