Android客户端与服务器端socket通讯的时候如果是中文出现乱码。 如题。有没有高手帮忙帮忙啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务端与 客户端最好统一字符编码呀。。UTF-8的呀 private void sendMessage() throws IOException { // TODO Auto-generated method stub System.out.println(FormatToUTFStr(mStrMSG)); for(Socket client : mClientList){ mPrintWriter = new PrintStream(client.getOutputStream(),true); mPrintWriter.println(FormatToGbkStr(mStrMSG)); } } public String FormatToGbkStr(String str){ if(str == null || str.length() ==0){ return ""; } try{ return new String(str.getBytes("UTF-8"),"ISO-8859-1"); }catch(UnsupportedEncodingException e){ return str; } } public String FormatToUTFStr(String str){ if(str == null || str.length() ==0){ return ""; } try{ return new String(str.getBytes("ISO-8859-1"),"UTF-8"); }catch(UnsupportedEncodingException e){ return str; } } 客服端的:package com.server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.ServerSocket;import java.net.Socket;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Server_0100 { private static final int SERVERPORT = 54321; private static List<Socket> mClientList = new ArrayList<Socket>(); private ExecutorService mExecutorServerSocket; private ServerSocket mServerSocket; private String ADB_PATH = "D://android/android-sdk-windows/platform-tools/adb.exe"; private String mStrMSG; int flag = 2; public static void main(String[] args) { new Server_0100(); } public Server_0100() { try { Runtime.getRuntime().exec(ADB_PATH+" forward tcp:12555 tcp:12345"); mServerSocket = new ServerSocket(SERVERPORT); mExecutorServerSocket = Executors.newCachedThreadPool(); System.out.println("start....."); Socket client = null; while (true) { client = mServerSocket.accept(); mClientList.add(client); ThreadServer threadServer = new ThreadServer(client); mExecutorServerSocket.execute(threadServer); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class ThreadServer implements Runnable { private Socket mSocket; private BufferedReader mBufferedReader; private PrintStream mPrintWriter; public ThreadServer(Socket socket) throws IOException { // TODO Auto-generated constructor stub this.mSocket = socket; mBufferedReader = new BufferedReader(new InputStreamReader( socket.getInputStream())); mStrMSG = "user:" + this.mSocket.getInetAddress() + " come total:" + mClientList.size(); sendMessage(); } //@Override public void run() { // TODO Auto-generated method stub try { while((mStrMSG = mBufferedReader.readLine()) != null){ if(mStrMSG.trim().equals("exit")){ mClientList.remove(mSocket); mBufferedReader.close(); mPrintWriter.close(); mStrMSG="user:"+this.mSocket.getInetAddress()+"exit total:"+mClientList.size(); mSocket.close(); sendMessage(); break; }else{ mStrMSG = mSocket.getInetAddress() + ":" + FormatToUTFStr(mStrMSG); sql(); flag++; sendMessage(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void sendMessage() throws IOException { // TODO Auto-generated method stub System.out.println(mStrMSG); for(Socket client : mClientList){ mPrintWriter = new PrintStream(client.getOutputStream(),true); mPrintWriter.println(FormatToGbkStr(mStrMSG)); } } public String FormatToGbkStr(String str){ if(str == null || str.length() ==0){ return ""; } try{ return new String(str.getBytes("UTF-8"),"ISO-8859-1"); }catch(UnsupportedEncodingException e){ return str; } } public String FormatToUTFStr(String str){ if(str == null || str.length() ==0){ return ""; } try{ return new String(str.getBytes("ISO-8859-1"),"UTF-8"); }catch(UnsupportedEncodingException e){ return str; } } public void sql(){ Connection conn = null; PreparedStatement pstmt = null; String contents = mStrMSG; try{ Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?user=root&password=root"); String mSql = "insert into bracode_gps values (?, ? )"; pstmt = conn.prepareStatement(mSql); pstmt.setInt(1, flag); pstmt.setString(2, contents); pstmt.executeUpdate(); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try{ if (pstmt != null) { pstmt.close(); pstmt = null; } if (conn != null) { conn.close(); conn = null; } }catch(SQLException e){ e.printStackTrace(); } } } }} 客户端的:package com.test;import java.io.*;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.Socket;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class Activity01 extends Activity{ private final String DEBUG_TAG = "Activity01"; //服务器IP、端口 private static final String SERVERIP = "192.168.1.88"; private static final int SERVERPORT = 54321; private Thread mThread = null; private Socket mSocket = null; private Button mButton_In = null; private Button mButton_Send= null; private EditText mEditText01 = null; private EditText mEditText02 = null; private BufferedReader mBufferedReader = null; private PrintStream mPrintWriter = null; private String mStrMSG = ""; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton_In = (Button)findViewById(R.id.Button_In); mButton_Send = (Button)findViewById(R.id.Button_Send); mEditText01=(EditText)findViewById(R.id.EditText01); mEditText02=(EditText)findViewById(R.id.EditText02); //登陆 mButton_In.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { //连接服务器 mSocket = new Socket(SERVERIP, SERVERPORT); //取得输入、输出流 mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),"utf-8")); mPrintWriter=new PrintStream(mSocket.getOutputStream(),true,"utf-8"); } catch (Exception e) { // TODO: handle exception Log.e(DEBUG_TAG, e.toString()); } } }); //发送消息 mButton_Send.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { //取得编辑框中我们输入的内容 String str = mEditText02.getText().toString() + "\n"; //发送给服务器 if(str.trim() != "exit"){ mPrintWriter.print(FormatToGbkStr(str)); mPrintWriter.flush(); } else{ mPrintWriter.flush(); mPrintWriter.close(); } } catch (Exception e) { // TODO: handle exception Log.e(DEBUG_TAG, e.toString()); } } }); mThread = new Thread(mRunnable); mThread.start(); } public String FormatToGbkStr(String str){ if(str == null || str.length() ==0){ return ""; } try{ return new String(str.getBytes("UTF-8"),"ISO-8859-1"); }catch(UnsupportedEncodingException e){ return str; } } public String FormatToUTFStr(String str){ if(str == null || str.length() ==0){ return ""; } try{ return new String(str.getBytes("ISO-8859-1"),"UTF-8"); }catch(UnsupportedEncodingException e){ return str; } } //线程:监听服务器发来的消息 private Runnable mRunnable = new Runnable() { public void run() { while (true) { try { if ( (mStrMSG = mBufferedReader.readLine()) != null ) { //消息换行 mStrMSG+="\n"; mHandler.sendMessage(mHandler.obtainMessage()); } // 发送消息 } catch (Exception e) { Log.e(DEBUG_TAG, e.toString()); } } } }; Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); // 刷新 try { //将聊天记录添加进来 mEditText01.append(FormatToUTFStr(mStrMSG)); } catch (Exception e) { Log.e(DEBUG_TAG, e.toString()); } } };} socket接收到的buffer和长度len,使用下面的函数getInfoBuff(buff, len)返回字符串。private String getInfoBuff(char[] buff, int count) char[] temp = new char[count]; for(int i=0; i<count; i++) { temp[i] = buff[i]; } return new String(temp);} android怎么屏蔽状态栏下拉? 请教:关于onTouchEvent的压感参数 如何改变启动的activity 新手向大家请教几个问题 ProgressBar 颜色问题~~~怎样改变它的颜色呢? socket在局域网可以通讯,在服务器上不行。 禁用滚动条触摸事件 请教:Android下能不能编写一个应用程序使它成为一个守护进程? animationdrawable 播放间隔时间不能大于9秒? 实现音乐播放器listview点击跳转播放,请大神指教 android入门,求好的教材 android高手请进。。。。。。
// TODO Auto-generated method stub
System.out.println(FormatToUTFStr(mStrMSG));
for(Socket client : mClientList){
mPrintWriter = new PrintStream(client.getOutputStream(),true);
mPrintWriter.println(FormatToGbkStr(mStrMSG));
}
}
public String FormatToGbkStr(String str){
if(str == null || str.length() ==0){
return "";
}
try{
return new String(str.getBytes("UTF-8"),"ISO-8859-1");
}catch(UnsupportedEncodingException e){
return str;
}
}
public String FormatToUTFStr(String str){
if(str == null || str.length() ==0){
return "";
}
try{
return new String(str.getBytes("ISO-8859-1"),"UTF-8");
}catch(UnsupportedEncodingException e){
return str;
}
}
package com.server;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server_0100 {
private static final int SERVERPORT = 54321;
private static List<Socket> mClientList = new ArrayList<Socket>();
private ExecutorService mExecutorServerSocket;
private ServerSocket mServerSocket;
private String ADB_PATH = "D://android/android-sdk-windows/platform-tools/adb.exe";
private String mStrMSG;
int flag = 2;
public static void main(String[] args) {
new Server_0100();
} public Server_0100() {
try {
Runtime.getRuntime().exec(ADB_PATH+" forward tcp:12555 tcp:12345");
mServerSocket = new ServerSocket(SERVERPORT);
mExecutorServerSocket = Executors.newCachedThreadPool();
System.out.println("start.....");
Socket client = null;
while (true) {
client = mServerSocket.accept();
mClientList.add(client);
ThreadServer threadServer = new ThreadServer(client);
mExecutorServerSocket.execute(threadServer);
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} class ThreadServer implements Runnable { private Socket mSocket;
private BufferedReader mBufferedReader;
private PrintStream mPrintWriter; public ThreadServer(Socket socket) throws IOException {
// TODO Auto-generated constructor stub
this.mSocket = socket;
mBufferedReader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
mStrMSG = "user:" + this.mSocket.getInetAddress() + " come total:"
+ mClientList.size();
sendMessage();
} //@Override
public void run() {
// TODO Auto-generated method stub
try {
while((mStrMSG = mBufferedReader.readLine()) != null){
if(mStrMSG.trim().equals("exit")){
mClientList.remove(mSocket);
mBufferedReader.close();
mPrintWriter.close();
mStrMSG="user:"+this.mSocket.getInetAddress()+"exit total:"+mClientList.size();
mSocket.close();
sendMessage();
break;
}else{
mStrMSG = mSocket.getInetAddress() + ":" + FormatToUTFStr(mStrMSG);
sql();
flag++;
sendMessage();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } private void sendMessage() throws IOException {
// TODO Auto-generated method stub
System.out.println(mStrMSG);
for(Socket client : mClientList){
mPrintWriter = new PrintStream(client.getOutputStream(),true);
mPrintWriter.println(FormatToGbkStr(mStrMSG));
}
}
public String FormatToGbkStr(String str){
if(str == null || str.length() ==0){
return "";
}
try{
return new String(str.getBytes("UTF-8"),"ISO-8859-1");
}catch(UnsupportedEncodingException e){
return str;
}
}
public String FormatToUTFStr(String str){
if(str == null || str.length() ==0){
return "";
}
try{
return new String(str.getBytes("ISO-8859-1"),"UTF-8");
}catch(UnsupportedEncodingException e){
return str;
}
}
public void sql(){
Connection conn = null;
PreparedStatement pstmt = null;
String contents = mStrMSG;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?user=root&password=root");
String mSql = "insert into bracode_gps values (?, ? )";
pstmt = conn.prepareStatement(mSql);
pstmt.setInt(1, flag);
pstmt.setString(2, contents);
pstmt.executeUpdate();
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if (pstmt != null) {
pstmt.close();
pstmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
}
package com.test;import java.io.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;public class Activity01 extends Activity
{
private final String DEBUG_TAG = "Activity01";
//服务器IP、端口
private static final String SERVERIP = "192.168.1.88";
private static final int SERVERPORT = 54321;
private Thread mThread = null;
private Socket mSocket = null;
private Button mButton_In = null;
private Button mButton_Send= null;
private EditText mEditText01 = null;
private EditText mEditText02 = null;
private BufferedReader mBufferedReader = null;
private PrintStream mPrintWriter = null;
private String mStrMSG = "";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton_In = (Button)findViewById(R.id.Button_In);
mButton_Send = (Button)findViewById(R.id.Button_Send);
mEditText01=(EditText)findViewById(R.id.EditText01);
mEditText02=(EditText)findViewById(R.id.EditText02);
//登陆
mButton_In.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
//连接服务器
mSocket = new Socket(SERVERIP, SERVERPORT);
//取得输入、输出流
mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),"utf-8"));
mPrintWriter=new PrintStream(mSocket.getOutputStream(),true,"utf-8");
}
catch (Exception e)
{
// TODO: handle exception
Log.e(DEBUG_TAG, e.toString());
}
}
});
//发送消息
mButton_Send.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
//取得编辑框中我们输入的内容
String str = mEditText02.getText().toString() + "\n";
//发送给服务器
if(str.trim() != "exit"){
mPrintWriter.print(FormatToGbkStr(str));
mPrintWriter.flush();
}
else{
mPrintWriter.flush();
mPrintWriter.close();
}
}
catch (Exception e)
{
// TODO: handle exception
Log.e(DEBUG_TAG, e.toString());
}
}
});
mThread = new Thread(mRunnable);
mThread.start();
}
public String FormatToGbkStr(String str){
if(str == null || str.length() ==0){
return "";
}
try{
return new String(str.getBytes("UTF-8"),"ISO-8859-1");
}catch(UnsupportedEncodingException e){
return str;
}
}
public String FormatToUTFStr(String str){
if(str == null || str.length() ==0){
return "";
}
try{
return new String(str.getBytes("ISO-8859-1"),"UTF-8");
}catch(UnsupportedEncodingException e){
return str;
}
}
//线程:监听服务器发来的消息
private Runnable mRunnable = new Runnable()
{
public void run()
{
while (true)
{
try
{
if ( (mStrMSG = mBufferedReader.readLine()) != null )
{
//消息换行
mStrMSG+="\n";
mHandler.sendMessage(mHandler.obtainMessage());
}
// 发送消息
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
}
};
Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
super.handleMessage(msg);
// 刷新
try
{
//将聊天记录添加进来
mEditText01.append(FormatToUTFStr(mStrMSG));
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
};
}
private String getInfoBuff(char[] buff, int count) char[] temp = new char[count];
for(int i=0; i<count; i++)
{
temp[i] = buff[i];
}
return new String(temp);
}