我在自己本机上运行工具:中华经典网络军刀.exe(其实就是nc.exe的图形工具,TCP协议),监听本机的8000端口
然后在模拟机上运行SocketClient程序,经测试,可以正常与PC机上的8000端口建立连接,并可正常发送数据到服务端(指中华经典网络军刀.exe),但该android程序无法接收服务端返回的数据,并且发到服务端的汉字显示为乱码,请问如何解决这两个问题,麻烦高手赐教,万分感谢!附上SocketClient程序完整源码:package com.SocketClient; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;public class SocketClient extends Activity {
/** Called when the activity is first created. */
private final String DEBUG_TAG = "Activity";
private String ipaddress;
private int port ; //服务器IP、端口
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 EditText mPortEdit =null;
private EditText mIpEdit =null;
private PrintWriter mPrintWriter = null;
private String mStrMSG = "";
boolean connected;
@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);
mPortEdit=(EditText)findViewById(R.id.PortEdit);
mIpEdit=(EditText)findViewById(R.id.IpEdit);
mButton_In.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
if(!connected)
{
ipaddress=mIpEdit.getText().toString();
port=Integer.parseInt(mPortEdit.getText().toString());
try
{
mSocket = new Socket(ipaddress, port); //连接服务器
mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));//取得输入、输出流
mPrintWriter=new PrintWriter(mSocket.getOutputStream(), true);
mIpEdit.setEnabled(false);
mPortEdit.setEnabled(false);
mButton_In.setText("disConnect");
connected=true;
mEditText02.setEnabled(connected);
mButton_Send.setEnabled(connected);
}
catch (Exception e)
{
new AlertDialog.Builder(SocketClient.this)
.setTitle("ERROR!")
.setMessage(e.toString())
.setPositiveButton
(
"确定",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface,int i)
{
mIpEdit.setText("");
mPortEdit.setText("");
}
}
)
.show();
Log.e(DEBUG_TAG, e.toString());
}
}
else
{
connected=false;
mEditText02.setText("");
mButton_In.setText("Connect");
mPrintWriter.print("exit"+"\n");
mPrintWriter.flush();
mIpEdit.setEnabled(true);
mPortEdit.setEnabled(true);
mEditText02.setEnabled(connected);
mButton_Send.setEnabled(connected);
}
}
});
mButton_Send.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
String str = mEditText02.getText().toString() + "\n";//取得编辑框中我们输入的内容
mEditText02.setText("");
try
{
mPrintWriter.print(str);//发送给服务器
mPrintWriter.flush();
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
});
mThread = new Thread(mRunnable);
mThread.start();
}
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(mStrMSG);//将聊天及返回记录添加进来
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
};
public boolean onKeyDown(int keyCode,KeyEvent event)
{
if(keyCode==KeyEvent.KEYCODE_BACK)
{
String str="exit"+"\n";
try
{
mPrintWriter.print(str);//发送给服务器
mPrintWriter.flush();
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
this.finish();
}
return true;
}
}
然后在模拟机上运行SocketClient程序,经测试,可以正常与PC机上的8000端口建立连接,并可正常发送数据到服务端(指中华经典网络军刀.exe),但该android程序无法接收服务端返回的数据,并且发到服务端的汉字显示为乱码,请问如何解决这两个问题,麻烦高手赐教,万分感谢!附上SocketClient程序完整源码:package com.SocketClient; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;public class SocketClient extends Activity {
/** Called when the activity is first created. */
private final String DEBUG_TAG = "Activity";
private String ipaddress;
private int port ; //服务器IP、端口
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 EditText mPortEdit =null;
private EditText mIpEdit =null;
private PrintWriter mPrintWriter = null;
private String mStrMSG = "";
boolean connected;
@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);
mPortEdit=(EditText)findViewById(R.id.PortEdit);
mIpEdit=(EditText)findViewById(R.id.IpEdit);
mButton_In.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
if(!connected)
{
ipaddress=mIpEdit.getText().toString();
port=Integer.parseInt(mPortEdit.getText().toString());
try
{
mSocket = new Socket(ipaddress, port); //连接服务器
mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));//取得输入、输出流
mPrintWriter=new PrintWriter(mSocket.getOutputStream(), true);
mIpEdit.setEnabled(false);
mPortEdit.setEnabled(false);
mButton_In.setText("disConnect");
connected=true;
mEditText02.setEnabled(connected);
mButton_Send.setEnabled(connected);
}
catch (Exception e)
{
new AlertDialog.Builder(SocketClient.this)
.setTitle("ERROR!")
.setMessage(e.toString())
.setPositiveButton
(
"确定",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface,int i)
{
mIpEdit.setText("");
mPortEdit.setText("");
}
}
)
.show();
Log.e(DEBUG_TAG, e.toString());
}
}
else
{
connected=false;
mEditText02.setText("");
mButton_In.setText("Connect");
mPrintWriter.print("exit"+"\n");
mPrintWriter.flush();
mIpEdit.setEnabled(true);
mPortEdit.setEnabled(true);
mEditText02.setEnabled(connected);
mButton_Send.setEnabled(connected);
}
}
});
mButton_Send.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
String str = mEditText02.getText().toString() + "\n";//取得编辑框中我们输入的内容
mEditText02.setText("");
try
{
mPrintWriter.print(str);//发送给服务器
mPrintWriter.flush();
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
});
mThread = new Thread(mRunnable);
mThread.start();
}
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(mStrMSG);//将聊天及返回记录添加进来
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
}
};
public boolean onKeyDown(int keyCode,KeyEvent event)
{
if(keyCode==KeyEvent.KEYCODE_BACK)
{
String str="exit"+"\n";
try
{
mPrintWriter.print(str);//发送给服务器
mPrintWriter.flush();
}
catch (Exception e)
{
Log.e(DEBUG_TAG, e.toString());
}
this.finish();
}
return true;
}
}
使用readLine()服务端发来的数据要用回车#13结尾pc端一般GB2312可以解码,发送时要转换编码格式,你网上搜索一下显示中文乱码的解决方法吧,具体我也没试过。