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(" ME: " + s + " 发送成功"); } else { tv1.append(" 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,实际测试中直接发送无法接收到数据,后来发现必须在发送数据的末尾加入'
'换行符才能识别到,目前ReadLine是行读取没有了行标志无法读取到数据
4.中文乱码问题 字符编码格式的问题 可以使用GB2312格式解析
in= new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));
源码下载:下载地址