请问如何能在网络传送中文信息?? byte[] b;String str = new String(b, "GBK");注意字符编码就可以了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 试过了,但不成呀,再指教!发送程序片段如下:void sendData() { try { String msg=textField1.getText (); if(msg.equals ("")) return; textField1.setText (""); InetAddress address=InetAddress.getByName ("202.192.247.211"); int len=msg.length (); byte[] message=new byte[len]; msg.getBytes(0,len,message,0); DatagramPacket packet =new DatagramPacket (message,len,address,9999); DatagramSocket socket=new DatagramSocket (); socket.send (packet); } catch(Exception e) { } }接收程序片段如下:void waitForData() { try{ byte[] buffer=new byte[1024]; DatagramPacket packet=new DatagramPacket (buffer,buffer.length ); DatagramSocket socket=new DatagramSocket (9999); while(true) { socket.receive(packet); String s=new String(buffer,0,0,packet.getLength ()); textArea1.append (s+"\n"); packet=new DatagramPacket (buffer,buffer.length); } } catch(Exception e) { } 用这个吧。public static int StringTobytes(String pStrSource,byte[] pbArDest,int piStartPos) { if(piStartPos<0 || pbArDest == null) return 0; byte[] bArTemp = pStrSource.getBytes(); int iNormalLen = bArTemp.length; if(pbArDest.length < piStartPos+iNormalLen+2) return 0; for(int i=0;i<iNormalLen;i++) pbArDest[piStartPos+i] = bArTemp[i]; //the string ending tag '0000' pbArDest[piStartPos+iNormalLen] = pbArDest[piStartPos+iNormalLen+1] = (byte)0; return (iNormalLen+2); }public static String bytesToString(byte[] pbArSource,int piStartPos) { //search for the double zero bytes. int iEndPos = -1; for(int i = piStartPos;i<pbArSource.length-1;i++) { if(pbArSource[i] == (byte)0 && pbArSource[i+1] == (byte)0) { iEndPos = i; break; } } if(iEndPos == -1) return ""; String StrTemp = new String(pbArSource,piStartPos,iEndPos - piStartPos); return StrTemp; } 能不能直接改程序,而不再用其它的方法转换呀,如上面的兄弟,byte[] b;String str = new String(b, "GBK");这样会比较简单,但这不行,唉!难道没有其它方法吗?再请大虾们指教!!! 你接收的时候没有成功显示中文字符(即使使用了msgTxt=new String (msgTxt.getBytes("ISO-88591"),"gb2312"也不行)那是因为你发送时将String str(假设为你要发送的字串,含中文)转为byte[] strbt时对中文字符的处理出错了。给你一个将含中文字串转为byte[]的CLASS.接收时再使用对应的将byte[]转成String的就行(可能还要使用上面的gb2312转一下);反正我是成功了的class BytesToString { public static String BytesToStringWay(byte[] source, int startPos, int byteLength) { if(startPos<0 || byteLength<=0 || source == null || source.length < startPos+byteLength-1)return null; StringBuffer ret= new StringBuffer(byteLength); char c=' '; int k=0; byte b=0; for(int i=0;i<byteLength;i++) { b = source[startPos+i]; if(b<0) k = 256+b; else k = b; c = (char)k; ret.append(c); } //ret.append() return ret.toString(); }}class StrToByCN { public static int StrTobytes(String pStrSource,byte[] pbArDest,int piStartPos) { if(piStartPos<0 || pbArDest == null) return 0; byte[] bArTemp = pStrSource.getBytes(); int iNormalLen = bArTemp.length; if(pbArDest.length < piStartPos+iNormalLen) return 0; for(int i=0;i<iNormalLen;i++) pbArDest[piStartPos+i] = bArTemp[i]; return (iNormalLen); }} 关于中文问题,我想重要的你知道用户给你的是什么编码,传输中使用什么编码,显示给用户是使用什么编码?例如:用户gb-->应用程序iso8859-1-->网络传输iso -->应用程序iso-->用户gb如果只是转来转去,看看成功就行了,永远不知道正确的方法。 以下经调试可行: static void sendData(){ try { String msg=("testit中午");//textField1.getText (); if(msg.equals ("")) return;// textField1.setText (""); InetAddress address=InetAddress.getByName ("10.10.1.37");// int len=msg.length ();// byte[] message=new byte[len];// msg.getBytes(0,len,message,0); byte[] message=msg.getBytes(); DatagramPacket packet =new DatagramPacket (message,message.length,address,9999); DatagramSocket socket=new DatagramSocket (); socket.send (packet); } catch(Exception e) { e.printStackTrace(); } } static void waitForData() { try{ byte[] buffer=new byte[1024]; DatagramPacket packet=new DatagramPacket (buffer,buffer.length ); DatagramSocket socket=new DatagramSocket (9999); while(true) { socket.receive(packet);// String s=new String(buffer,0,0,packet.getLength ()); String s=new String(buffer,0,packet.getLength()); System.out.println("getData:"+(s)); packet=new DatagramPacket (buffer,buffer.length); } } catch(Exception e) { } } 什么是xml嵌套标签 谁有twaver 3.5完整包给我一份 ***怪问题**从文件中读出字符串作为另一个文件的路径,总是失败,为何? 调用dll的问题 为什么不能获得焦点事件 关于在Jtable中内嵌下拉框的问题 求助!!关于两行代码的理解问题!请大虾近来看看!!(在线等待) 请问哪有jbuilder的汉化补丁 谁能告诉我 如何安装jdk 多线程问题,小白求指导。 Session:如何跨web application使用session?或者解决方案? 一个菜鸟的问题!
发送程序片段如下:
void sendData()
{
try
{
String msg=textField1.getText ();
if(msg.equals (""))
return;
textField1.setText ("");
InetAddress address=InetAddress.getByName ("202.192.247.211");
int len=msg.length ();
byte[] message=new byte[len];
msg.getBytes(0,len,message,0);
DatagramPacket packet =new DatagramPacket (message,len,address,9999);
DatagramSocket socket=new DatagramSocket ();
socket.send (packet);
}
catch(Exception e)
{
}
}接收程序片段如下:void waitForData()
{
try{
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket (buffer,buffer.length );
DatagramSocket socket=new DatagramSocket (9999);
while(true)
{
socket.receive(packet);
String s=new String(buffer,0,0,packet.getLength ());
textArea1.append (s+"\n");
packet=new DatagramPacket (buffer,buffer.length);
}
}
catch(Exception e)
{
}
public static int StringTobytes(String pStrSource,byte[] pbArDest,int piStartPos)
{
if(piStartPos<0 || pbArDest == null)
return 0;
byte[] bArTemp = pStrSource.getBytes();
int iNormalLen = bArTemp.length;
if(pbArDest.length < piStartPos+iNormalLen+2)
return 0;
for(int i=0;i<iNormalLen;i++)
pbArDest[piStartPos+i] = bArTemp[i];
//the string ending tag '0000'
pbArDest[piStartPos+iNormalLen] = pbArDest[piStartPos+iNormalLen+1] = (byte)0; return (iNormalLen+2);
}public static String bytesToString(byte[] pbArSource,int piStartPos)
{
//search for the double zero bytes.
int iEndPos = -1;
for(int i = piStartPos;i<pbArSource.length-1;i++)
{
if(pbArSource[i] == (byte)0 && pbArSource[i+1] == (byte)0)
{
iEndPos = i;
break;
}
}
if(iEndPos == -1)
return "";
String StrTemp = new String(pbArSource,piStartPos,iEndPos - piStartPos);
return StrTemp;
}
byte[] b;
String str = new String(b, "GBK");
这样会比较简单,但这不行,唉!难道没有其它方法吗?
再请大虾们指教!!!
(即使使用了msgTxt=new String (msgTxt.getBytes("ISO-88591"),"gb2312"也不行)
那是因为你发送时将String str(假设为你要发送的字串,含中文)转为byte[] strbt时对中文字符的处理出错了。给你一个将含中文字串转为byte[]的CLASS.接收时再使用对应的将byte[]转成String的就行(可能还要使用上面的gb2312转一下);反正我是成功了的
class BytesToString {
public static String BytesToStringWay(byte[] source,
int startPos, int byteLength) {
if(startPos<0 || byteLength<=0 || source == null
|| source.length < startPos+byteLength-1)return null; StringBuffer ret= new StringBuffer(byteLength);
char c=' ';
int k=0;
byte b=0;
for(int i=0;i<byteLength;i++)
{
b = source[startPos+i];
if(b<0) k = 256+b; else k = b;
c = (char)k;
ret.append(c);
}
//ret.append()
return ret.toString();
}
}
class StrToByCN {
public static int StrTobytes(String pStrSource,byte[] pbArDest,int piStartPos) {
if(piStartPos<0 || pbArDest == null)
return 0;
byte[] bArTemp = pStrSource.getBytes();
int iNormalLen = bArTemp.length;
if(pbArDest.length < piStartPos+iNormalLen)
return 0;
for(int i=0;i<iNormalLen;i++)
pbArDest[piStartPos+i] = bArTemp[i];
return (iNormalLen);
}
}
我想重要的你知道用户给你的是什么编码,
传输中使用什么编码,
显示给用户是使用什么编码?
例如:
用户gb-->应用程序iso8859-1-->网络传输iso -->应用程序iso-->用户gb如果只是转来转去,看看成功就行了,永远不知道正确的方法。
static void sendData(){
try
{
String msg=("testit中午");//textField1.getText ();
if(msg.equals (""))
return;
// textField1.setText ("");
InetAddress address=InetAddress.getByName ("10.10.1.37");
// int len=msg.length ();
// byte[] message=new byte[len];
// msg.getBytes(0,len,message,0);
byte[] message=msg.getBytes(); DatagramPacket packet =new DatagramPacket (message,message.length,address,9999);
DatagramSocket socket=new DatagramSocket ();
socket.send (packet);
}
catch(Exception e)
{
e.printStackTrace();
}
} static void waitForData()
{
try{
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket (buffer,buffer.length );
DatagramSocket socket=new DatagramSocket (9999);
while(true)
{
socket.receive(packet);
// String s=new String(buffer,0,0,packet.getLength ());
String s=new String(buffer,0,packet.getLength());
System.out.println("getData:"+(s));
packet=new DatagramPacket (buffer,buffer.length);
}
}
catch(Exception e)
{
}
}