当前位置: 技术问答>java相关
****157分,解决立马给分,UDP中文问题!!!!!
来源: 互联网 发布时间:2015-03-25
本文导语: 一个很简单的UDP程序,发送英文正确,中文出现乱码,估计是字符集转换有问题,请帮忙! 发送方程序: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; public class UdpTest extends JFra...
一个很简单的UDP程序,发送英文正确,中文出现乱码,估计是字符集转换有问题,请帮忙!
发送方程序:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class UdpTest extends JFrame
{
private JTextArea textArea=new JTextArea(200,120);
private Container con=null;
private JButton clear=new JButton("清除");
private JButton send=new JButton("发送");
private DatagramSocket udp=null;
public UdpTest()
{
try
{
udp=new DatagramSocket(8018);
}
catch(SocketException e){}
con=getContentPane();
con.setLayout(new BorderLayout());
con.add(new JScrollPane(textArea),BorderLayout.CENTER);
JPanel temp=new JPanel(new FlowLayout());
temp.add(clear);
temp.add(send);
con.add(temp,BorderLayout.SOUTH);
clear.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
textArea.setText("");
}
});
send.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
String dat=textArea.getText();
byte[] dataBuf=new byte[512];
String newDat=new String(dat.getBytes(),"gb2312");
newDat.getBytes(0,newDat.length(),dataBuf,0);
DatagramPacket packet=new DatagramPacket(dataBuf,512,InetAddress.getByName("10.10.111.33"),8018);
udp.send(packet);
}
catch(Exception exc){}
}
});
setBounds(200,200,200,200);
setResizable(false);
}
public static void main(String[] args)
{
(new UdpTest()).show();
}
}
接受方程序
import java.io.*;
import java.net.*;
public class UdpReceive
{
public static void main(String[] args)
{
try
{
DatagramSocket udpReceive=new DatagramSocket(8018);
byte[] dataBuf=new byte[512];
DatagramPacket packet=new DatagramPacket(dataBuf,512);
System.out.println("开始在8018端口监听……");
while(true)
{
udpReceive.receive(packet);
System.out.println(new String(packet.getData(),"gb2312"));
}
}
catch(Exception e){}
}
}
发送方程序:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class UdpTest extends JFrame
{
private JTextArea textArea=new JTextArea(200,120);
private Container con=null;
private JButton clear=new JButton("清除");
private JButton send=new JButton("发送");
private DatagramSocket udp=null;
public UdpTest()
{
try
{
udp=new DatagramSocket(8018);
}
catch(SocketException e){}
con=getContentPane();
con.setLayout(new BorderLayout());
con.add(new JScrollPane(textArea),BorderLayout.CENTER);
JPanel temp=new JPanel(new FlowLayout());
temp.add(clear);
temp.add(send);
con.add(temp,BorderLayout.SOUTH);
clear.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
textArea.setText("");
}
});
send.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
String dat=textArea.getText();
byte[] dataBuf=new byte[512];
String newDat=new String(dat.getBytes(),"gb2312");
newDat.getBytes(0,newDat.length(),dataBuf,0);
DatagramPacket packet=new DatagramPacket(dataBuf,512,InetAddress.getByName("10.10.111.33"),8018);
udp.send(packet);
}
catch(Exception exc){}
}
});
setBounds(200,200,200,200);
setResizable(false);
}
public static void main(String[] args)
{
(new UdpTest()).show();
}
}
接受方程序
import java.io.*;
import java.net.*;
public class UdpReceive
{
public static void main(String[] args)
{
try
{
DatagramSocket udpReceive=new DatagramSocket(8018);
byte[] dataBuf=new byte[512];
DatagramPacket packet=new DatagramPacket(dataBuf,512);
System.out.println("开始在8018端口监听……");
while(true)
{
udpReceive.receive(packet);
System.out.println(new String(packet.getData(),"gb2312"));
}
}
catch(Exception e){}
}
}
|
预备知识:
1.字节和unicode
Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式
是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节.
Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,
可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是
public static ByteToCharConverter getDefault() ;
public static ByteToCharConverter getConverter(String encoding);
如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用
8859_1
我们来就一个简单的例子:
"你"的gb码是:0xC4E3 ,unicode是0x4F60
你用:
--encoding="gb2312";
--byte b[]={(byte)'u00c4',(byte)'u00E3'};
--convertor=ByteToCharConverter.getConverter(encoding);
--char [] c=converter.convertAll(b);
--for(int i=0;i
1.字节和unicode
Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式
是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节.
Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,
可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是
public static ByteToCharConverter getDefault() ;
public static ByteToCharConverter getConverter(String encoding);
如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用
8859_1
我们来就一个简单的例子:
"你"的gb码是:0xC4E3 ,unicode是0x4F60
你用:
--encoding="gb2312";
--byte b[]={(byte)'u00c4',(byte)'u00E3'};
--convertor=ByteToCharConverter.getConverter(encoding);
--char [] c=converter.convertAll(b);
--for(int i=0;i