A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈样 黑马帝   /  2012-2-7 15:40  /  3981 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈样 于 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();
        }
}

6 个回复

正序浏览
杨扬 黑马帝 2012-2-7 16:46:56
7#
String send = "这是一个UDP程序sadfsdfsdf";
DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.length(),InetAddress.getByName("localhost"),9998);

这两行....你dp传的长度是String的length(),默认的是byte类型..一个中文占2字节...所以输出才会少
回复 使用道具 举报
本帖最后由 刘基军 于 2012-2-7 16:36 编辑

public String(byte[] bytes,
              int offset,
              int length)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度
回复 使用道具 举报
本帖最后由 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.
回复 使用道具 举报
呵呵,
同学要细心哪。
参数 为byte[]的长度,非String[]的长度。
回复 使用道具 举报
本帖最后由 张伟~ 于 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()是字符串的长度,不是字节数组的长度,肯定不行了
回复 使用道具 举报
DatagramSocket ds = new DatagramSocket(9997);
DatagramPacket dp = new DatagramPacket(send.getBytes(), 0,send.length(),InetAddress.getByName("localhost"),9998);
一个9997端口一个9998 你把9997删掉看下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马