Android笔记:Socket客户端收发数据

原文地址为: Android笔记:Socket客户端收发数据

client.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width
="match_parent"
android:layout_height
="match_parent"
android:orientation
="vertical" >

<TextView
android:layout_width="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerHorizontal
="true"
android:layout_centerVertical
="true"
android:text
="接收到的信息" />

<TextView
android:id="@+id/tv1"
android:layout_width
="150dp"
android:layout_height
="wrap_content"
android:layout_centerHorizontal
="true"
android:layout_centerVertical
="true"
android:layout_weight
="0.25"
android:text
="" />

<TextView
android:layout_width="wrap_content"
android:layout_height
="wrap_content"
android:layout_centerHorizontal
="true"
android:layout_centerVertical
="true"
android:text
="请输入发送内容" />

<EditText
android:id="@+id/editText1"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:ems
="10" >

<requestFocus />
</EditText>

<LinearLayout
android:layout_width="match_parent"
android:layout_height
="wrap_content" >
<Button
android:id="@+id/button1"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:text
="发送" />
<Button
android:id="@+id/button2"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:text
="设置" />

</LinearLayout>



</LinearLayout>

client.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Client extends Activity {
private String TAG = "===Client===";
private String TAG1 = "===Send===";
private TextView tv1 = null;
Handler mhandler;
Handler mhandlerSend;
boolean isRun = true;
EditText edtsendms;
Button btnsend;
private String sendstr = "";
SharedPreferences sp;
Button btnSetting;
private Context ctx;
Socket socket;
PrintWriter out;
BufferedReader in;
SocThread socketThread;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.client);
tv1
= (TextView) findViewById(R.id.tv1);
btnsend
= (Button) findViewById(R.id.button1);
ctx
= Client.this;
edtsendms
= (EditText) findViewById(R.id.editText1);
btnSetting
= (Button) findViewById(R.id.button2);
mhandler
= new Handler() {
@Override
public void handleMessage(Message msg) {
try {
MyLog.i(TAG,
"mhandler接收到msg=" + msg.what);
if (msg.obj != null) {
String s
= msg.obj.toString();
if (s.trim().length() > 0) {
MyLog.i(TAG,
"mhandler接收到obj=" + s);
MyLog.i(TAG,
"开始更新UI");
tv1.append(
"Server:" + s);
MyLog.i(TAG,
"更新UI完毕");
}
else {
Log.i(TAG,
"没有数据返回不更新");
}
}
}
catch (Exception ee) {
MyLog.i(TAG,
"加载过程出现异常");
ee.printStackTrace();
}
}
};
mhandlerSend
= new Handler() {
@Override
public void handleMessage(Message msg) {
try {
MyLog.i(TAG,
"mhandlerSend接收到msg.what=" + msg.what);
String s
= msg.obj.toString();
if (msg.what == 1) {
tv1.append(
"\n ME: " + s + " 发送成功");
}
else {
tv1.append(
"\n ME: " + s + " 发送失败");
}
}
catch (Exception ee) {
MyLog.i(TAG,
"加载过程出现异常");
ee.printStackTrace();
}
}
};
startSocket();
btnsend.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
// 发送数据
MyLog.i(TAG, "准备发送数据");
sendstr
= edtsendms.getText().toString().trim();
socketThread.Send(sendstr);

}
});
btnSetting.setOnClickListener(
new OnClickListener() {

@Override
public void onClick(View v) {
// 跳转到设置界面
Intent intent = new Intent();
intent.setClass(Client.
this, Setting.class);
MyLog.i(TAG,
"跳转至设置界面");
ctx.startActivity(intent);
// 打开新界面

}
});

}

public void startSocket() {
socketThread
= new SocThread(mhandler, mhandlerSend, ctx);
socketThread.start();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.client, menu);
return true;
}

private void stopSocket() {
socketThread.isRun
= false;
socketThread.close();
socketThread
= null;
MyLog.i(TAG,
"Socket已终止");
}

@Override
protected void onStart() {
super.onStart();
Log.e(TAG,
"start onStart~~~");
}

@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,
"start onRestart~~~");
startSocket();
}

@Override
protected void onResume() {
super.onResume();
Log.e(TAG,
"start onResume~~~");
}

@Override
protected void onPause() {
super.onPause();
Log.e(TAG,
"start onPause~~~");
}

@Override
protected void onStop() {
super.onStop();
Log.e(TAG,
"start onStop~~~");
stopSocket();
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,
"start onDestroy~~~");

}

}

socket线程:SocThread.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class SocThread extends Thread {
private String ip = "10.0.0.113";
private int port = 13000;
private String TAG = "socket thread";
private int timeout = 10000;

public Socket client = null;
PrintWriter out;
BufferedReader in;
public boolean isRun = true;
Handler inHandler;
Handler outHandler;
Context ctx;
private String TAG1 = "===Send===";
SharedPreferences sp;

public SocThread(Handler handlerin, Handler handlerout, Context context) {
inHandler
= handlerin;
outHandler
= handlerout;
ctx
= context;
MyLog.i(TAG,
"创建线程socket");
}

/**
* 连接socket服务器
*/
public void conn() {

try {
initdate();
Log.i(TAG,
"连接中……");
client
= new Socket(ip, port);
client.setSoTimeout(timeout);
// 设置阻塞时间
MyLog.i(TAG, "连接成功");
in
= new BufferedReader(new InputStreamReader(
client.getInputStream()));
out
= new PrintWriter(new BufferedWriter(new OutputStreamWriter(
client.getOutputStream())),
true);
MyLog.i(TAG,
"输入输出流获取成功");
}
catch (UnknownHostException e) {
MyLog.i(TAG,
"连接错误UnknownHostException 重新获取");
e.printStackTrace();
conn();
}
catch (IOException e) {
MyLog.i(TAG,
"连接服务器io错误");
e.printStackTrace();
}
catch (Exception e) {
MyLog.i(TAG,
"连接服务器错误Exception" + e.getMessage());
e.printStackTrace();
}
}

public void initdate() {
sp
= ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
ip
= sp.getString("ipstr", ip);
port
= Integer.parseInt(sp.getString("port", String.valueOf(port)));
MyLog.i(TAG,
"获取到ip端口:" + ip + ";" + port);
}

/**
* 实时接受数据
*/
@Override
public void run() {
MyLog.i(TAG,
"线程socket开始运行");
conn();
MyLog.i(TAG,
"1.run开始");
String line
= "";
while (isRun) {
try {
if (client != null) {
MyLog.i(TAG,
"2.检测数据");
while ((line = in.readLine()) != null) {
MyLog.i(TAG,
"3.getdata" + line + " len=" + line.length());
MyLog.i(TAG,
"4.start set Message");
Message msg
= inHandler.obtainMessage();
msg.obj
= line;
inHandler.sendMessage(msg);
// 结果返回给UI处理
MyLog.i(TAG1, "5.send to handler");
}

}
else {
MyLog.i(TAG,
"没有可用连接");
conn();
}
}
catch (Exception e) {
MyLog.i(TAG,
"数据接收错误" + e.getMessage());
e.printStackTrace();
}
}
}

/**
* 发送数据
*
*
@param mess
*/
public void Send(String mess) {
try {
if (client != null) {
MyLog.i(TAG1,
"发送" + mess + "至"
+ client.getInetAddress().getHostAddress() + ":"
+ String.valueOf(client.getPort()));
out.println(mess);
out.flush();
MyLog.i(TAG1,
"发送成功");
Message msg
= outHandler.obtainMessage();
msg.obj
= mess;
msg.what
= 1;
outHandler.sendMessage(msg);
// 结果返回给UI处理
} else {
MyLog.i(TAG,
"client 不存在");
Message msg
= outHandler.obtainMessage();
msg.obj
= mess;
msg.what
= 0;
outHandler.sendMessage(msg);
// 结果返回给UI处理
MyLog.i(TAG, "连接不存在重新连接");
conn();
}

}
catch (Exception e) {
MyLog.i(TAG1,
"send error");
e.printStackTrace();
}
finally {
MyLog.i(TAG1,
"发送完毕");

}
}

/**
* 关闭连接
*/
public void close() {
try {
if (client != null) {
MyLog.i(TAG,
"close in");
in.close();
MyLog.i(TAG,
"close out");
out.close();
MyLog.i(TAG,
"close client");
client.close();
}
}
catch (Exception e) {
MyLog.i(TAG,
"close err");
e.printStackTrace();
}

}
}

 说明:

1.接收数据并读取时的推荐使用BufferedReader 会比直接读取要效率高些
2.BufferedReader默认大小:8192个字节=84Mbit,utf-8下等于4596个字符 一般足够用了
3.接收数据使用的是ReadLine,实际测试中直接发送无法接收到数据,后来发现必须在发送数据的末尾加入'\n'换行符才能识别到,目前ReadLine是行读取没有了行标志无法读取到数据
4.中文乱码问题 字符编码格式的问题 可以使用GB2312格式解析
  in= new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));

 源码下载:下载地址


转载请注明本文地址: Android笔记:Socket客户端收发数据

猜你喜欢

转载自blog.csdn.net/zhengxiuchen86/article/details/81951415
今日推荐