黑马程序员技术交流社区
标题:
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