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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bird_not_fat 中级黑马   /  2013-10-14 12:21  /  1119 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bird_not_fat 于 2013-10-14 20:47 编辑

接收端:

  1. <p> </p>
复制代码
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.net.UnknownHostException;
  7. /**
  8. * 示例:应用UDP协议的Socket接收端示例
  9. * @author lt
  10. */
  11. public class UDPReceiveDemo {
  12.         public void receiveData() throws SocketException,UnknownHostException,IOException{
  13.                 //创建一个指定端口和IP的UDP码头,不写在while中防止出现bindException
  14.                 DatagramSocket ds = new DatagramSocket(50000,InetAddress.getLocalHost());
  15.                 while(true){
  16.                         //创建一个数据包对象用于接收数据包
  17.                         byte[] bt = new byte[1024];
  18.                         DatagramPacket dp = new DatagramPacket(bt,bt.length);
  19.                         //通过receive方法接收数据包
  20.                         ds.receive(dp);
  21.                         //获取数据包中的信息,发送的时候封装了InetAddress对象,端口号,字符串
  22.                         int port = dp.getPort();//发送端的端口号
  23.                         InetAddress ia = dp.getAddress();//发送端的IP地址
  24.                         byte[] getByte = dp.getData();
  25.                         int length = dp.getLength();
  26.                         String getByteStr = new String(getByte,0,length);
  27.                         System.out.println(port + " " +  ia.getHostAddress() + " " +
  28.                                                        length + " " + getByteStr);
  29.                 }
  30.         }
  31.         public static void main(String[] args) {
  32.                 try {
  33.                         new UDPReceiveDemo().receiveData();
  34.                 } catch (SocketException e) {
  35.                         System.out.println("创建DatagramSocket出现异常。");
  36.                 } catch (UnknownHostException e) {
  37.                         System.out.println("未知主机异常。");
  38.                 } catch (IOException e) {
  39.                         System.out.println("接收数据包时发生异常。");
  40.                 }
  41.         }
  42. }
复制代码
发送端:
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.net.DatagramPacket;
  6. import java.net.DatagramSocket;
  7. import java.net.InetAddress;
  8. import java.net.SocketException;
  9. import java.net.UnknownHostException;
  10. /**
  11. * 示例:键盘输入的方式向服务器发送信息
  12. * @author lt
  13. */
  14. public class UDPSendKeyboardDemo {

  15.         public void sendDataByKeyboard() throws SocketException,UnknownHostException,IOException{
  16.                 //可以制定一个发送端的端口
  17.                 DatagramSocket ds = new DatagramSocket();
  18.                 InputStream is = System.in;
  19.                 BufferedReader br = new BufferedReader(new InputStreamReader(is));
  20.                 String str = null;
  21.                 while((str = br.readLine())!=null){
  22.                         if("88".equals(str)){
  23.                                 break;
  24.                         }
  25.                         DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),
  26.                                         InetAddress.getLocalHost(),50000);
  27.                         ds.send(dp);
  28.                 }
  29.                
  30.                 if(ds != null){
  31.                         ds.close();
  32.                 }
  33.                
  34.         }
  35.         public static void main(String[] args) {
  36.                 try {
  37.                         new UDPSendKeyboardDemo().sendDataByKeyboard();
  38.                 } catch (SocketException e) {
  39.                         System.out.println("数据报Socket创建时发生异常。");
  40.                 } catch (UnknownHostException e) {
  41.                         System.out.println("未知主机异常。");
  42.                 } catch (IOException e) {
  43.                         System.out.println("发送数据包异常。");
  44.                 }
  45.         }
  46. }
复制代码
我在发送端输入中文,比如  "黑马程序员",在服务器端只能收到  "50057 115.27.28.77 5 黑马?" 即为中文字符只能收到一半,为什么只能接收到一半??
我改成DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length() * 2,
          InetAddress.getLocalHost(),50000);就能接收到完整中文字符了,这是为什么呢????


评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

3 个回复

倒序浏览

"黑马程序员" 这是5个字,你在获取这五个字的字节的时候,在GBK编码中是10个字节,
而"黑马程序员".length();这个方法的时候,获取的长度是5.说明你向服务器发送5个字节
"黑马程序员"截取5个的时候就变成了"黑马?".

你的程序可以这样修改:
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,
          InetAddress.getLocalHost(),50000);
这样就打全了

str.geiBytes().length得到的是10
str.length() 得到的是5

不知道我这么说你能明白么

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
雪人 发表于 2013-10-14 12:42
"黑马程序员" 这是5个字,你在获取这五个字的字节的时候,在GBK编码中是10个字节,
而"黑马程序员".length() ...

额,我知道了,又粗心了,谢谢啦~
回复 使用道具 举报
To 金牌黑马 2013-10-14 19:29:22
板凳
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马