最近在研究Socket编程,今天做实验时遇到了如下的一个乱码问题,大家先看看我的代码:
1.接受方的代码:package com.glw.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
try {
ds = new DatagramSocket(3000);
byte[] buf = new byte[1024];
dp = new DatagramPacket(buf,1024);
String receiveInfo = new String(dp.getData(),"utf-8");
ds.receive(dp); 
System.out.println(receiveInfo);
System.out.println(dp.getAddress()+","+dp.getPort());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
ds.close();
}
}
}
2.发送方的代码:package com.glw.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
try {
ds = new DatagramSocket();
byte[] sendInfo = {'g'};
dp = new DatagramPacket(sendInfo,sendInfo.length,
InetAddress.getByName("127.0.0.1"),3000);
ds.send(dp);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
ds.close();
}
}
}
3.执行的结果是乱码(如下)
口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口口
/127.0.0.1,61050问题:1.应该执行的结果是:g   /127.0.0.1,61050
      2.我的编译环境都是utf-8的编码格式
      3.哪位高手知道怎么解决该问题,帮忙解决一下,谢谢!

解决方案 »

  1.   


    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    public class Server {
        public static void main(String[] args) {
            DatagramSocket ds = null;
            DatagramPacket dp = null;
            try {
                ds = new DatagramSocket(3000);
                byte[] buf = new byte[1024];
                dp = new DatagramPacket(buf,1024);
                while (true)
                {
                 ds.receive(dp);
                 System.out.println(new String(buf).trim());
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }finally{
                ds.close();
            }
        }
    }import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    public class Client {
        public static void main(String[] args) {
            DatagramSocket ds = null;
            DatagramPacket dp = null;
            try {
                ds = new DatagramSocket();
                String str="I love you!";
                byte[] sendInfo = str.getBytes();
                dp = new DatagramPacket(sendInfo,sendInfo.length,
                        InetAddress.getByName("127.0.0.1"),3000);
                ds.send(dp);
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }finally{
                ds.close();
            }
        }
    }
      

  2.   

    悲剧,发现自己看程序看不明白,只能去运行才明白。
    楼主的错误在Server这个类里面。
                String receiveInfo = new String(dp.getData(),"utf-8");
                ds.receive(dp); 
                System.out.println(receiveInfo);
    看api可以知道,只有执行了ds.receive(dp),dp中才会被收到的数据填充。
    你这种写法,receiveInfo是一片空白。
    应该改成:
                  ds.receive(dp); 
                String receiveInfo = new String(dp.getData(),"utf-8");
                System.out.println(receiveInfo);
    这样打印出来是'g'加一堆空白。空白是因为你只传来一个'g',为什么没有数据就出方框,我暂时还没明白。
      

  3.   

    修改为
                dp = new DatagramPacket(buf,1024);
                ds.receive(dp); 
                String receiveInfo = new String(dp.getData(),0,dp.getLength(),"utf-8"); 
                System.out.println(receiveInfo);