Android客户端通过socket与服务器通信。
由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI代码不一样。
Android客户端通过socket与服务器通信分为下面5步:
(1)通过IP地址和端口实例化Socket,请求连接服务器;
1. socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321
(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter
1. PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。
(3)对Socket进行读写
1. out.println(message);
(4)关闭打开的流
1. out.close();
完整工程代码如下:
1. package com.yarin.android.Examples_08_04;
2.
3. import java.io.BufferedReader;
4. import java.io.BufferedWriter;
5. import java.io.InputStreamReader;
6. import java.io.OutputStreamWriter;
7. import java.io.PrintWriter;
8. import java.net.Socket;
9.
10. import android.app.Activity;
11. import android.os.Bundle;
12. import android.util.Log;
13. import android.view.View;
14. import android.view.View.OnClickListener;
15. import android.widget.Button;
16. import android.widget.EditText;
17. import android.widget.TextView;
18.
19. public class Activity01 extends Activity
20. {
21. private final String DEBUG_TAG = "Activity01";
22.
23. private TextView mTextView = null;
24. private EditText mEditText = null;
25. private Button mButton = null;
26.
27. @Override
28. public void onCreate(Bundle savedInstanceState)
29. {
30. super.onCreate(savedInstanceState);
31. setContentView(R.layout.main);
32.
33. mButton = (Button)findViewById(R.id.Button01);
34. mTextView = (TextView)findViewById(R.id.TextView01);
35. mEditText = (EditText)findViewById(R.id.EditText01);
36.
37. //登陆
38. mButton.setOnClickListener(new OnClickListener()
39. {
40. public void onClick(View v)
41. {
42. Socket socket = null;
43. String message = mEditText.getText().toString() + "/r/n";
44. try
45. {
46. //创建Socket
47. // socket = new Socket("192.168.1.110",54321);
48. socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321
49. //向服务器发送消息
50. PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
51. out.println(message);
52.
53. //接收来自服务器的消息
54. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
55. String msg = br.readLine();
56.
57. if ( msg != null )
58. {
59. mTextView.setText(msg);
60. }
61. else
62. {
63. mTextView.setText("数据错误!");
64. }
65. //关闭流
66. out.close();
67. br.close();
68. //关闭Socket
69. socket.close();
70. }
71. catch (Exception e)
72. {
73. // TODO: handle exception
74. Log.e(DEBUG_TAG, e.toString());
75. }
76. }
77. });
78. }
79. }
布局文件main.xml
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns: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. >
7. <TextView
8. android:id="@+id/TextView01"
9. android:layout_width="fill_parent"
10. android:layout_height="wrap_content"
11. android:text="这里显示接收到服务器发来的信息"
12. />
13. <EditText
14. android:id="@+id/EditText01"
15. android:text="输入要发送的内容"
16. android:layout_width="fill_parent"
17. android:layout_height="wrap_content">
18. </EditText>
19. <Button
20. android:id="@+id/Button01"
21. android:layout_width="fill_parent"
22. android:layout_height="wrap_content"
23. android:text="发送"
24. />
25. </LinearLayout>
AndroidManifest.xml文件如下
1. <?xml version="1.0" encoding="utf-8"?>
2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3. package="com.yarin.android.Examples_08_04"
4. android:versionCode="1"
5. android:versionName="1.0">
6. <application android:icon="@drawable/icon" android:label="@string/app_name">
7. <activity android:name=".Activity01"
8. android:label="@string/app_name">
9. <intent-filter>
10. <action android:name="android.intent.action.MAIN" />
11. <category android:name="android.intent.category.LAUNCHER" />
12. </intent-filter>
13. </activity>
14. </application>
15. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
16. <uses-sdk android:minSdkVersion="5" />
17. </manifest>