黑马程序员技术交流社区

标题: udp数据传输不完整少六个字节 [打印本页]

作者: 沈样    时间: 2012-2-7 15:40
标题: udp数据传输不完整少六个字节
本帖最后由 沈样 于 2012-3-3 15:33 编辑

今天编写一个udp程序发现少了六个字节怎么调也不行
服务端:
package com.java.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
*这是一个udp的程序udpServerA程序用于接收数据
*编程步骤:
*1.创建一个DatagramSocket
*2.创建一个byte[]用于存放数据
*3.接收数据
*4.打印数据
*5.关闭连接**/
public class UdpServerA {

        public static void main(String[] args) throws Exception{
                DatagramSocket ds = new DatagramSocket(9998);
                byte[] buff = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buff, 1024);
                ds.receive(dp);
                String str = new String(dp.getData(),0,dp.getLength());
            System.out.println(str);
            ds.close();
        }
}
客户端:
package com.java.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* 这是一个udp客户端的程序用于发送服务的数据
* 编程步骤:
* 1.创建一个DatagramSocket
* 2.发送的字符串
* 3.创建一个数据包包装发送的字符串
* 4.发送信息*/

public class UdpClientA {

        public static void main(String[] args) throws Exception{
                DatagramSocket ds = new DatagramSocket(9997);
                String send = "这是一个UDP程序sadfsdfsdf";
                DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.length(),InetAddress.getByName("localhost"),9998);
                ds.send(dp);
                ds.close();
        }
}

作者: 张伟~    时间: 2012-2-7 15:49
DatagramSocket ds = new DatagramSocket(9997);
DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.length(),InetAddress.getByName("localhost"),9998);
一个9997端口一个9998 你把9997删掉看下
作者: 张伟~    时间: 2012-2-7 15:54
本帖最后由 张伟~ 于 2012-2-7 15:57 编辑

如果还不行的话就是这里的问题
String send = "这是一个UDP程序sadfsdfsdf";
                 DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.length(),InetAddress.getByName("localhost"),9998);
改成 byte[] buf = "这是一个UDP程序sadfsdfsdf".getBytes();
                 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),9998);

你那send.length()是字符串的长度,不是字节数组的长度,肯定不行了

作者: 王文龙    时间: 2012-2-7 16:14
呵呵,
同学要细心哪。
参数 为byte[]的长度,非String[]的长度。

作者: 侯丽星    时间: 2012-2-7 16:22
本帖最后由 hlxsuperstar 于 2012-2-7 16:36 编辑

你的UdpClientA需改下,如下:(需改动的部分见红色标粗部分)
public class UdpClientA {

        /**
         * @param args
         */
        public static void main(String[] args){
                // TODO Auto-generated method stub
        DatagramSocket ds = new DatagramSocket(9997);
        String send = "这是一个UDP程序sadfsdfsdf";
                DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.getBytes().length,InetAddress.getByName("localhost"),9998);
        ds.send(dp);
        ds.close();

        }

}

注:若红色部分为send.length(),则只发送19个字节,因为你send中的长度就是19.
作者: 刘基军    时间: 2012-2-7 16:31
本帖最后由 刘基军 于 2012-2-7 16:36 编辑

public String(byte[] bytes,
              int offset,
              int length)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度

作者: 杨扬    时间: 2012-2-7 16:46
String send = "这是一个UDP程序sadfsdfsdf";
DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.length(),InetAddress.getByName("localhost"),9998);

这两行....你dp传的长度是String的length(),默认的是byte类型..一个中文占2字节...所以输出才会少




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2