Android中Socket的應(yīng)用分析
本文實例分析了Android中Socket的應(yīng)用。分享給大家供大家參考,具體如下:
Android 提供的常用的網(wǎng)絡(luò)編程包括針對TCP/IP協(xié)議的Socket通信。Socket是一種跨平臺的編程方式,可以在異構(gòu)語言之間進行通信。
Socket程序的開發(fā)原理,是要實現(xiàn)服務(wù)器端和客戶端。
服務(wù)器,使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接。
客戶端,使用Socket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時的、動態(tài)的分配一個1024以上的端口。
下面是一個實現(xiàn)socket的例子:
服務(wù)器端代碼:
package com.socket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* com Server
*/
public class Main {
private int ServerPort = 9999;
private ServerSocket serversocket = null;
private OutputStream outputStream = null;
private InputStream inputStream = null;
private PrintWriter printWinter = null;
private Socket socket = null;
private BufferedReader reader = null;
public Main(){
try{
serversocket = new ServerSocket(ServerPort);
System.out.println("服務(wù)啟動。。。");
socket = serversocket.accept();
System.out.println("客戶已連接");
}catch(Exception ex){
ex.printStackTrace();
}
try{
outputStream= socket.getOutputStream();
inputStream = socket.getInputStream();
printWinter = new PrintWriter(outputStream,true);
reader = new BufferedReader(new InputStreamReader(inputStream));
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true){
String message = reader.readLine();
System.out.println("client:"+message);
if(message.equals("bye")||message.equals("Bye")){
break;
}
message = in.readLine();
printWinter.println(message);
}
outputStream.close();
inputStream.close();
socket.close();
serversocket.close();
System.out.print("Client is disconnected");
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
public static void main(String[] args){
new Main();
}
}
客服端代碼:
package com.Aina.Android;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Test extends Activity implements Runnable {
/** Called when the activity is first created. */
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.0.132";
private static final int PORT = 9999;
private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
private String content = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_msg = (TextView) this.findViewById(R.id.TextView);
ed_msg = (EditText) this.findViewById(R.id.EditText01);
btn_login = (Button) this.findViewById(R.id.Button01);
btn_send = (Button) this.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 (Exception ex) {
ex.printStackTrace();
ShowDialog("登陸異常:" + ex.getMessage());
}
btn_send.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
String msg = ed_msg.getText().toString();
if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
out.println(msg);
}
}
}
});
new Thread(this).start();
}
public void ShowDialog(String msg) {
new AlertDialog.Builder(this).setTitle("提示").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) {
Log.i("TAG", "++ "+content);
content += "\n";
mHandler.sendMessage(mHandler.obtainMessage());
}else{
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("TAG", "-- "+msg);
tv_msg.setText(tv_msg.getText().toString() + content);
}
};
}
XML文件布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: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/TextView" android:singleLine="false" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:hint="content" android:id="@+id/EditText01" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> <Button android:text="login" android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> <Button android:text="send" android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> </LinearLayout>
先啟動服務(wù)器端,再運行客戶端程序。
注意:
(一)即使服務(wù)器端和客戶端在一臺機器上運行,也不能使用ip地址:127.0.0.1,否則,程序會出現(xiàn)拒絕連接的錯誤。
(二)客戶端和服務(wù)器端最好不要建在一個工程下,最好是分別建立工程,然后啟動服務(wù)器端和客戶端,否則會報Error: ShouldNotReachHere()錯誤。這是因為Android程序不是已main方法為程序的入口。
運行效果:


更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android通信方式總結(jié)》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android開發(fā)入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- android通過配置文件設(shè)置應(yīng)用安裝到SD卡上的方法
- Android應(yīng)用 坐標(biāo)系詳細介紹
- Android編程之重力感應(yīng)用法分析
- Android仿百度谷歌搜索自動提示框AutoCompleteTextView簡單應(yīng)用示例
- Android 動畫之TranslateAnimation應(yīng)用詳解
- Android 動畫之RotateAnimation應(yīng)用詳解
- Android TabWidget切換卡的實現(xiàn)應(yīng)用
- Android判斷當(dāng)前應(yīng)用程序處于前臺還是后臺的兩種方法
- Android開發(fā)筆記之:用Enum(枚舉類型)取代整數(shù)集的應(yīng)用詳解
- Android 應(yīng)用的安裝過程詳解
相關(guān)文章
Android簡單創(chuàng)建一個Activity的方法
這篇文章主要介紹了Android簡單創(chuàng)建一個Activity的方法,結(jié)合圖文形式分析了Android創(chuàng)建Activity的具體步驟與實現(xiàn)技巧,需要的朋友可以參考下2016-04-04
Android ListView 滾動條的設(shè)置詳解及實例代碼
這篇文章主要介紹了 ListView等滾動條的設(shè)置詳解詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android 中讀取SD卡文件時拋出NullPointerException錯誤解決辦法
這篇文章主要介紹了Android 中讀取SD卡文件時拋出NullPointerException錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android實現(xiàn)關(guān)機后數(shù)據(jù)不會丟失問題
這篇文章主要介紹了Android實現(xiàn)關(guān)機后數(shù)據(jù)不會丟失問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10
Android實現(xiàn)底部狀態(tài)欄切換的兩種方式
這篇文章主要介紹了Android實現(xiàn)底部狀態(tài)欄切換功能,在文中給大家提到了兩種實現(xiàn)方式,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
解決android報錯:Intel HAXM is required to run this AVD
這篇文章主要介紹了解決android報錯:Intel HAXM is required to run this AVD,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

