在Linux下的C++服务器与java客户端交互是需要注意java把数据发送到字节流的时候是采用大端法储存的,而C++服务器是采用小端法储存的,在前面的知识中我们可以知道大端法就是高位在低地址,小端法是低位在低地址。在c++服务器中我并不想改变其的实现方式,那么就只能在安卓客户端方面进行更改了。通过把int转为字节序列,然后反转字节序列,进行大端到小端的转换(因为c++服务器是以小端法进行解析数据包的)。还有一个问题就是字符编码的问题,因为Linux下默认采用的编码和Java下默认采用的编码是相同的,都是UTF-8.所以这个问题就可以忽略了。
下面是android端的mainActivity的代码部分
package com.fgmoblietech.jackson.helloworld;
import android.content.Intent;
import android.os.Debug;
import android.os.StrictMode;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DebugUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText Account;
EditText Password;
ClientNetwork clientThread=null;
public void ShowToast(String str)
{
Toast.makeText(this,str,Toast.LENGTH_LONG).show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
//StrictMode.setThreadPolicy(policy);
Account=(EditText)findViewById(R.id.et_mAccount);
Password=(EditText)findViewById(R.id.et_mPass);
Log.e("asoidjio","startThread");
clientThread=new ClientNetwork("23j2v24417.imwork.net",9000);
clientThread.setMain(this);
clientThread.start();
Log.e("asdasda","endThread");
//Button btn=(Button)findViewById(R.id.button);
//btn.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
//
// Intent intent = new Intent();
// intent.setAction("jackson.intent.secondActivity");
// intent.putExtra("account", "jackson");
// startActivityForResult(intent, 100);
// }
//});
Button btn=(Button)findViewById(R.id.btn_registerStart);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String strAccount=Account.getText().toString().trim();
String strPass=Password.getText().toString().trim();
LoginData data=new LoginData();
data.PutData(strAccount,strPass,ServerData.login);
clientThread.setBytes(data.getBytes());
//Intent intent=new Intent(MainActivity.this,secondActivity.class);
//startActivityForResult(intent,100);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// String result=data.getStringExtra("result");
//TextView view=(TextView)findViewById(R.id.result);
//view.setText(result);
if(Account==null||Password==null) {
Log.e("main","null");
return;
}
Account.setText(data.getCharSequenceExtra("Account"));
Password.setText(data.getCharSequenceExtra("Password"));
}
}
其次是网络处理类
package com.fgmoblietech.jackson.helloworld;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Arrays;
public class ClientNetwork extends Thread {
Socket client;
private byte[] bytes=null;
private byte[] read_bytes=new byte[100];
public boolean valid=false;
private MainActivity main=null;
private String domainName;
private int port;
int count=0;
public void setMain(MainActivity c)
{
this.main=c;
}
public Socket GetSocket()
{
if(valid)
{
return client;
}
else
return null;
}
public void setBytes(byte[] b)
{
this.bytes=b;
this.count=this.bytes.length;
}
public void Send()
{
try {
OutputStream stream = client.getOutputStream();
stream.write(bytes);
}
catch(Exception e)
{
Log.e("client","error occur");
valid=false;
}
}
public ClientNetwork(String domainName,int port)
{
this.domainName=domainName;
this.port=port;
}
public void Recv()
{
try
{
InputStream stream=client.getInputStream();