Android實現(xiàn)TCP客戶端支持讀寫操作
本篇我們便來學(xué)習(xí)如何通過socket讀寫TCP.
需要注意的是socket必須寫在子線程中,不能在ui主線程中直接使用,所以我們這里創(chuàng)建了兩個class:
MainActivity(主界面)、TcpThread(獲取socket接收的數(shù)據(jù))
由于代碼有注釋了,所以就不解釋了.
1.gif效果如下

2.activity_main.xml如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <EditText android:id="@+id/et_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:hint="請?zhí)钊胍l(fā)送的內(nèi)容" /> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/et_text" android:text="發(fā)送" /> <TextView android:id="@+id/tv_recv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_send" android:minLines="20" android:hint="接收的內(nèi)容" /> </RelativeLayout>
3.MainActivity.java如下所示
package com.example.tcpdemo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
TcpThread mt;
TextView tv_recv;
EditText et_text; //要發(fā)送的內(nèi)容
Button btn_send;
//定義一個handler
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
//打印服務(wù)器端發(fā)來的消息
System.out.println("read:"+msg.obj.toString());
tv_recv.append(msg.obj.toString()+"\r\n");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_recv = (TextView)findViewById(R.id.tv_recv);
et_text = (EditText)findViewById(R.id.et_text);
mt = new TcpThread();
mt.setHandler(mHandler); //設(shè)置handler
mt.setIp("10.10.10.104"); //設(shè)置服務(wù)器地址
mt.start(); //啟動線程
btn_send = (Button)findViewById(R.id.btn_send);
btn_send.setOnClickListener(new OnClickListener() {
//向服務(wù)器端發(fā)送數(shù)據(jù)
public void onClick(View v) {
if(!mt.write(et_text.getText().toString()))
{
Toast.makeText(getApplicationContext(), "發(fā)送失敗", Toast.LENGTH_SHORT).show();
}
}
});
}
}
4.TcpThread.java如下所示
package com.example.tcpdemo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.Handler;
import android.os.Message;
public class TcpThread extends Thread {
Handler mHandler=null;
Socket socket = null;
String ip = null;
OutputStream outputStream = null; //輸出流
InputStream inputStream=null; //接收流
//獲取另一個線程的Handler
public void setHandler( Handler handler){
mHandler = handler;
}
//設(shè)置服務(wù)器IP
public void setIp(String ip){
this.ip = ip;
}
public void run(){
try {
socket = new Socket(ip, 8080); //訪問指定的ip地址:8080
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//獲取輸出流
try {
outputStream = socket.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
while (true) //讀取服務(wù)器端發(fā)送來的數(shù)據(jù)
{
final byte[] buffer = new byte[1024];//創(chuàng)建接收緩沖區(qū)
inputStream = socket.getInputStream();
final int len = inputStream.read(buffer);//數(shù)據(jù)讀出來,并且返回數(shù)據(jù)的長度
if(len>0)
{
Message msg = mHandler.obtainMessage();
//設(shè)置發(fā)送的內(nèi)容
msg.obj = new String(buffer,0,len);
mHandler.sendMessage(msg);
}
}
}
catch (IOException e) {
}
}
//向服務(wù)器端寫入數(shù)據(jù)
public boolean write(String text){
boolean ret = true;
try {
outputStream.write(text.toString().getBytes());
} catch (IOException e) {
ret = false;
e.printStackTrace();
}
return ret;
}
}
總結(jié)
以上所述是小編給大家介紹的Android實現(xiàn)TCP客戶端支持讀寫操作,希望對大家有所幫助!
相關(guān)文章
android監(jiān)控sim卡有沒有服務(wù)示例(sim卡管理)
android監(jiān)聽SIM卡有沒有服務(wù),可以使用android.telephony.PhoneStateListener類來實現(xiàn),下面是一個簡單的小例子,大家參考使用吧2014-01-01
Retrofit網(wǎng)絡(luò)請求和響應(yīng)處理重點(diǎn)分析講解
這篇文章主要介紹了Retrofit網(wǎng)絡(luò)請求和響應(yīng)處理重點(diǎn)分析,在使用?Retrofit發(fā)起網(wǎng)絡(luò)請求時,我們可以通過定義一個接口并使用Retrofit的注解來描述這個接口中的請求,Retrofit會自動生成一個實現(xiàn)該接口的代理對象2023-03-03
Android 使用URLConnection下載音頻文件的方法
有時候我們會需要下載音頻文件。這里提供一種思路,將在線音頻文件通過流寫到本地文件中。需要的朋友可以參考下2019-09-09
Android自定義狀態(tài)欄顏色與應(yīng)用標(biāo)題欄顏色一致
看IOS上的應(yīng)用,應(yīng)用中狀態(tài)欄的顏色總能與應(yīng)用標(biāo)題欄顏色保持一致,用戶體驗很不錯,對于這種效果怎么實現(xiàn)的呢?下面小編給大家分享android自定義狀態(tài)欄顏色與應(yīng)用標(biāo)題欄顏色一致的實現(xiàn)方法,一起看看吧2016-09-09
Android編程開發(fā)實現(xiàn)TextView顯示表情圖像和文字的方法
這篇文章主要介紹了Android編程開發(fā)實現(xiàn)TextView顯示表情圖像和文字的方法,結(jié)合實例形式分析了Android中TextView的使用技巧,需要的朋友可以參考下2015-12-12
Android 實現(xiàn)ListView的點(diǎn)擊變色的實例
這篇文章主要介紹了Android 實現(xiàn)ListView的點(diǎn)擊變色的實例的相關(guān)資料,主要實現(xiàn)Android listveiw ItemClickListener寫入變色的功能,需要的朋友可以參考下2017-07-07

