Android客户端通过socket与服务器通信
16lz
2022-01-01
下面是一个demo,Android客户端通过socket与服务器通信。
由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI代码不一样。
Android客户端通过socket与服务器通信分为下面5步:
(1)通过IP地址和端口实例化Socket,请求连接服务器;
[java] view plain copy
- socket=newSocket("10.14.114.127",54321);//IP:10.14.114.127,端口54321
(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter
[java] view plain copy
- PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。
(3)对Socket进行读写
[java] view plain copy
- out.println(message);
(4)关闭打开的流
[java] view plain copy
- out.close();
完整工程代码如下:
[java] view plain copy
- packagecom.yarin.android.Examples_08_04;
- importjava.io.BufferedReader;
- importjava.io.BufferedWriter;
- importjava.io.InputStreamReader;
- importjava.io.OutputStreamWriter;
- importjava.io.PrintWriter;
- importjava.net.Socket;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.TextView;
- publicclassActivity01extendsActivity
- {
- privatefinalStringDEBUG_TAG="Activity01";
- privateTextViewmTextView=null;
- privateEditTextmEditText=null;
- privateButtonmButton=null;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mButton=(Button)findViewById(R.id.Button01);
- mTextView=(TextView)findViewById(R.id.TextView01);
- mEditText=(EditText)findViewById(R.id.EditText01);
- //登陆
- mButton.setOnClickListener(newOnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- Socketsocket=null;
- Stringmessage=mEditText.getText().toString()+"/r/n";
- try
- {
- //创建Socket
- //socket=newSocket("192.168.1.110",54321);
- socket=newSocket("10.14.114.127",54321);//IP:10.14.114.127,端口54321
- //向服务器发送消息
- PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
- out.println(message);
- //接收来自服务器的消息
- BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()));
- Stringmsg=br.readLine();
- if(msg!=null)
- {
- mTextView.setText(msg);
- }
- else
- {
- mTextView.setText("数据错误!");
- }
- //关闭流
- out.close();
- br.close();
- //关闭Socket
- socket.close();
- }
- catch(Exceptione)
- {
- //TODO:handleexception
- Log.e(DEBUG_TAG,e.toString());
- }
- }
- });
- }
- }
布局文件main.xml
[java] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:id="@+id/TextView01"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="这里显示接收到服务器发来的信息"
- />
- <EditText
- android:id="@+id/EditText01"
- android:text="输入要发送的内容"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </EditText>
- <Button
- android:id="@+id/Button01"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="发送"
- />
- </LinearLayout>
AndroidManifest.xml文件如下
[java] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.yarin.android.Examples_08_04"
- android:versionCode="1"
- android:versionName="1.0">
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <activityandroid:name=".Activity01"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- <uses-permissionandroid:name="android.permission.INTERNET"></uses-permission>
- <uses-sdkandroid:minSdkVersion="5"/>
- </manifest>
当然,还有服务器端得代码
[java] view plain copy
- packagecom.yarin.android.Examples_08_04;
- importjava.io.BufferedReader;
- importjava.io.BufferedWriter;
- importjava.io.InputStreamReader;
- importjava.io.OutputStreamWriter;
- importjava.io.PrintWriter;
- importjava.net.ServerSocket;
- importjava.net.Socket;
- publicclassServerimplementsRunnable
- {
- publicvoidrun()
- {
- try
- {
- //创建ServerSocket
- ServerSocketserverSocket=newServerSocket(54321);
- while(true)
- {
- //接受客户端请求
- Socketclient=serverSocket.accept();
- System.out.println("accept");
- try
- {
- //接收客户端消息
- BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
- Stringstr=in.readLine();
- System.out.println("read:"+str);
- //向服务器发送消息
- PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(client.getOutputStream())),true);
- out.println("servermessage");
- //关闭流
- out.close();
- in.close();
- }
- catch(Exceptione)
- {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- finally
- {
- //关闭
- client.close();
- System.out.println("close");
- }
- }
- }
- catch(Exceptione)
- {
- System.out.println(e.getMessage());
- }
- }
- //main函数,开启服务器
- publicstaticvoidmain(Stringa[])
- {
- ThreaddesktopServerThread=newThread(newServer());
- desktopServerThread.start();
- }
- }
先开启服务器代码,
java Server即可
然后启动android模拟器。运行结果
这是Android客户端。输入12345,点击发送:
这是服务器端收到的消息
更多相关文章
- Android(安卓)Push Notificatioin Service(Android消息推送)
- 开发android,我们需要哪些技能基础
- Android推送通知指南
- Android客户端通过socket与服务器通信
- Android(安卓)Debug Bridge 技术实现原理
- android消息推送-XMPP
- Android(安卓)新闻客户端案例
- Android《第三章:AIDL与Messenger》
- Android之UI学习篇十:使用TabHost实现微博客户端界面