转载来源

android客户端通过socket与服务器进行通信可以分为以下几步:

应用程序与服务器通信可以采用两种模式:TCP可靠通信 和UDP不可靠通信。

(1)通过IP地址和端口实例化Socket,请求连接服务器:

socket = new Socket(HOST, PORT); //host:为服务器的IP地址 port:为服务器的端口号

(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter:

PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);

这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。

(3)对Socket进行读写

if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
out.println(msg);
}
}

(4)关闭打开的流

out.close();

在写代码的过程中一定要注意对socket 输入流 输出流的关闭

下面是一个简单的例子:

main.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <TextView
  7. android:id="@+id/TextView"
  8. android:singleLine="false"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"/>
  11. <EditTextandroid:hint="content"
  12. android:id="@+id/EditText01"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content">
  15. </EditText>
  16. <Button
  17. android:text="send"
  18. android:id="@+id/Button02"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content">
  21. </Button>
  22. </LinearLayout>

下面是android客户端的源代码:

package com.example.socketdemo;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 android.annotation.SuppressLint;import android.annotation.TargetApi;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.StrictMode;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;@TargetApi(Build.VERSION_CODES.GINGERBREAD)@SuppressLint("NewApi")public class SocketDemo extends Activity implements Runnable {private TextView tv_msg = null;private EditText ed_msg = null;private Button btn_send = null;// private Button btn_login = null;private static final String HOST = "192.168.1.223";private static final int PORT = 9999;private Socket socket = null;private BufferedReader in = null;private PrintWriter out = null;private String content = "";/** Called when the activity is first created. */@TargetApi(Build.VERSION_CODES.GINGERBREAD)@SuppressLint("NewApi")@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_socket_demo);////Android 2.3及以上调用严苛模式if (android.os.Build.VERSION.SDK_INT > 9) {StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);}tv_msg = (TextView) findViewById(R.id.TextView);ed_msg = (EditText) findViewById(R.id.EditText01);// btn_login = (Button) findViewById(R.id.Button01);btn_send = (Button) findViewById(R.id.Button02);try {socket = new Socket(HOST, PORT);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);} catch (IOException ex) {ex.printStackTrace();ShowDialog("login exception" + ex.getMessage());}btn_send.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {// TODO Auto-generated method stubString msg = ed_msg.getText().toString();if (socket.isConnected()) {if (!socket.isOutputShutdown()) {out.println(msg);}}}});new Thread(SocketDemo.this).start();}public void ShowDialog(String msg) {new AlertDialog.Builder(this).setTitle("notification").setMessage(msg).setPositiveButton("ok", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub}}).show();}public void run() {try {while (true) {if (socket.isConnected()) {if (!socket.isInputShutdown()) {if ((content = in.readLine()) != null) {content += "\n";mHandler.sendMessage(mHandler.obtainMessage());} else {}}}}} catch (Exception e) {e.printStackTrace();}}public Handler mHandler = new Handler() {public void handleMessage(Message msg) {super.handleMessage(msg);tv_msg.setText(tv_msg.getText().toString() + content);}};}

下面是服务器端的java代码:

[java] view plain copy
  1. importjava.io.BufferedReader;
  2. importjava.io.BufferedWriter;
  3. importjava.io.IOException;
  4. importjava.io.InputStreamReader;
  5. importjava.io.OutputStreamWriter;
  6. importjava.io.PrintWriter;
  7. importjava.net.ServerSocket;
  8. importjava.net.Socket;
  9. importjava.util.ArrayList;
  10. importjava.util.List;
  11. importjava.util.concurrent.ExecutorService;
  12. importjava.util.concurrent.Executors;
  13. publicclassMain{
  14. privatestaticfinalintPORT=9999;
  15. privateList<Socket>mList=newArrayList<Socket>();
  16. privateServerSocketserver=null;
  17. privateExecutorServicemExecutorService=null;//threadpool
  18. publicstaticvoidmain(String[]args){
  19. newMain();
  20. }
  21. publicMain(){
  22. try{
  23. server=newServerSocket(PORT);
  24. mExecutorService=Executors.newCachedThreadPool();//createathreadpool
  25. System.out.print("serverstart...");
  26. Socketclient=null;
  27. while(true){
  28. client=server.accept();
  29. mList.add(client);
  30. mExecutorService.execute(newService(client));//startanewthreadtohandletheconnection
  31. }
  32. }catch(Exceptione){
  33. e.printStackTrace();
  34. }
  35. }
  36. classServiceimplementsRunnable{
  37. privateSocketsocket;
  38. privateBufferedReaderin=null;
  39. privateStringmsg="";
  40. publicService(Socketsocket){
  41. this.socket=socket;
  42. try{
  43. in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
  44. msg="user"+this.socket.getInetAddress()+"cometoal:"
  45. +mList.size();
  46. this.sendmsg();
  47. }catch(IOExceptione){
  48. e.printStackTrace();
  49. }
  50. }
  51. @Override
  52. publicvoidrun(){
  53. //TODOAuto-generatedmethodstub
  54. try{
  55. while(true){
  56. if((msg=in.readLine())!=null){
  57. if(msg.equals("exit")){
  58. System.out.println("ssssssss");
  59. mList.remove(socket);
  60. in.close();
  61. msg="user:"+socket.getInetAddress()
  62. +"exittotal:"+mList.size();
  63. socket.close();
  64. this.sendmsg();
  65. break;
  66. }else{
  67. msg=socket.getInetAddress()+":"+msg;
  68. this.sendmsg();
  69. }
  70. }
  71. }
  72. }catch(Exceptione){
  73. e.printStackTrace();
  74. }
  75. }
  76. publicvoidsendmsg(){
  77. System.out.println(msg);
  78. intnum=mList.size();
  79. for(intindex=0;index<num;index++){
  80. SocketmSocket=mList.get(index);
  81. PrintWriterpout=null;
  82. try{
  83. pout=newPrintWriter(newBufferedWriter(
  84. newOutputStreamWriter(mSocket.getOutputStream())),true);
  85. pout.println(msg);
  86. }catch(IOExceptione){
  87. e.printStackTrace();
  88. }
  89. }
  90. }
  91. }
  92. }


注意在AndroidManifest.xml中加入对网络的访问权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

在写代码的过程中一定要注意对套接字和输入/输出流的关闭


更多相关文章

  1. Android通信机制之Android架构(一)
  2. android异步处理Handler+Thread使用进阶
  3. camp
  4. 玩转 Android(安卓)MediaPlayer之视频预加载(优化)
  5. 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)
  6. android下的网络摄像头服务器——使用rtsp协议
  7. Android(安卓)IPC机制(Android开发艺术探索)
  8. Android进程间通信纪要
  9. 万字长文带你了解最常用的开源 Squid 代理服务器

随机推荐

  1. Android对应版本号
  2. Android开发笔记(二)——布局管理器
  3. android 开发不容错过的网站
  4. Android调用系统设置,Android调用系统设置
  5. Android(安卓)USB tethering相关代码
  6. Android快速上手
  7. Android-----RelativeLayout属性
  8. cocos2d-x android
  9. Android(安卓)布局的属性
  10. Android调用打电话(Call Phone)