日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Tcp操作

發布時間:2025/7/14 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Tcp操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tcp是基于傳輸層的面向連接的可靠通訊協議,其優點是基于連接,使得服務端和客戶端可以實現雙向通信,且實時性高,在需要服務端主動向客戶端推送數據的應用場景中,使用TCP協議是一種很好的方式。

初學Android,將Android中Tcp的使用方式記錄一下,希望對新學Android開發的新同學有幫助,這里主要介紹TcpClient的使用,因為很少會用Android來建立TcpServer端。

這里主要介紹Tcp客戶端的幾個應用:

1.與服務器建立連接

2.向服務端發送數據

3.接收服務端返回的數據

4.斷線重連機制

?

在Android中使用socket有兩個地方需要注意的:

1.在AndroidMainfest.xml中需要添加對網絡的權限支持

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

2.Android中規定對socket的操作必須在線程中進行,如在主線程中進行操作會出現無法收發數據的情況。

?

(1)創建socket,與服務器建立連接

InetSocketAddress SerAddr = new InetSocketAddress(”192.168.1.100“,9988); //設置服務的IP地址和端口 try {
socket.connect(SerAddr,3000); //嘗試連接服務器
}catch (Exception e){

}
(2)發送數據

try {
      /注意采用utf-8編碼確保中文傳輸不會亂碼     BufferedWriter bufferedWriter =new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(),"utf-8"));    bufferedWriter.write(”Hello“);
  bufferedWriter.flush(); }catch (Exception e){

}

   
(3)接收數據

try {     inputStream = new DataInputStream(socket.getInputStream());     if(inputStream.available()>0)
    {       byte[] recData = new byte[inputStream.available()];
      inputStream.read(recData);       String iText=new String(recData,"utf-8");

     ?}

}catch (Exception e){

}

(4)斷線重連

當保持長時間的連接時,難免會因為網絡或其他原因導致客戶端與服務端斷開連接,所以代碼里面應該定時的去檢查連接狀態,當連接斷開時,

應該重新嘗試連接服務端。我們這里可以使用socket.sendUrgentData(0xFF);函數來檢測,當服務端斷開時,連續三次調用此函數會出現異常。

我們可以根據是否出現異常來斷定與服務器的連接情況。

try {
socket.sendUrgentData(0xFF);
}catch (Exception e){
socket.close(); //關閉套接字,重新創建新的并調用connect函數重新連接
socket = new Socket();
}

以下貼出TcpHelper類的具體代碼:

public class TcpHelper{
private Socket socket;
private BufferedWriter bufferedWriter;
private DataInputStream inputStream;
private boolean NeedStop;
private InetSocketAddress SerAddr;
public String ErrMsg;
private ReadThread readThread; //讀取數據線程
private OnReceiveEvent receiveEvent; //此事件用于當接收到數據時向主線程通知接收到的數據
private long LastCheckTime;
public static interface OnReceiveEvent{
public void ReceiveBytes(byte[] iData);
public void ReceiveString(String iData);
}
public enum EDataType{EDT_BYTE,EDT_STRING};
private EDataType dataType;
public TcpHelper(String HostIp,int HostPort) {
try {
LastCheckTime=System.currentTimeMillis();
readThread =new ReadThread();
NeedStop=false;
SerAddr = new InetSocketAddress(HostIp,HostPort);
NeedStop=false;
socket = new Socket();
readThread.start();
}catch (Exception e)
{
ErrMsg=e.getMessage();
}
}
public void SendString(String iText){ //發送字符串
dataType=EDataType.EDT_STRING;
toSend(iText);
}
public void SendBytes(byte[] iBuf){ //發送字節流指令
dataType=EDataType.EDT_BYTE;
String iText = new String(iBuf);
toSend(iText);
}
//發送數據線程
private void toSend(final String iText){
new Thread(
new Runnable() {
@Override
public void run() {
try {
bufferedWriter.write(iText);
bufferedWriter.flush();
} catch (Exception e) {
}
}
}
).start();
}
public boolean isConnected(){
return socket.isConnected();
}
//設置通知事件
public void setReceiveEvent(OnReceiveEvent iEvent){
receiveEvent=iEvent;
}
//讀取線程
private class ReadThread extends Thread{
@Override
public void run() {
while (!NeedStop){
try {
if (!socket.isConnected() || socket.isClosed()){
socket.connect(SerAddr,3000);
if(bufferedWriter==null)
bufferedWriter =new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(),"utf-8"));
if(inputStream==null)
inputStream = new DataInputStream(socket.getInputStream());
}
else {
if(inputStream.available()>0){
byte[] recData = new byte[inputStream.available()];
inputStream.read(recData);
if(receiveEvent!=null)
{
if(dataType==EDataType.EDT_BYTE) {
receiveEvent.ReceiveBytes(recData);
}
else {
String s=new String(recData,"utf-8");
receiveEvent.ReceiveString(s);
}
}
}
if (System.currentTimeMillis()-LastCheckTime>5000)
{
try {
LastCheckTime=System.currentTimeMillis();
socket.sendUrgentData(0xFF);
}catch (Exception e){
socket.close();
socket = new Socket();
bufferedWriter=null;
inputStream =null;
}
}
}

}catch (Exception e){

}
}
}
}
}

測試Tcp連接的Activity代碼:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;


public class TcpFormActivity extends Activity {
private TcpHelper tcpHelper;
private String SerIp;
private int SerPort;
private EditText InputMsg;
private TextView RecMsg;
private String TcpRecData;
private MyHandler handler;
private TcpReceive tcpReceive;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_tcpform);
RecMsg = (TextView)findViewById(R.id.TVTcpData);
InputMsg = (EditText)findViewById(R.id.EdtTcpMsg);
}
public class TcpReceive implements TcpHelper.OnReceiveEvent{
public synchronized void ReceiveBytes(byte[] iData){
}
public synchronized void ReceiveString(String iData){
TcpRecData=iData;
Message msg=new Message();
msg.what=1;
handler.sendMessage(msg);
}
}
class MyHandler extends Handler {
public MyHandler() {
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
RecMsg.append(TcpRecData); //接收到數據顯示到TextView上
break;
}
super.handleMessage(msg);
}
}
public void onConnectClick(View view){
if(tcpHelper==null)
{
SerIp = ((EditText)findViewById(R.id.EdtTcpSerIp)).getText().toString();
SerPort =Integer.parseInt(((TextView)findViewById(R.id.EdtTcpPort)).getText().toString());
tcpHelper = new TcpHelper(SerIp,SerPort);
tcpReceive = new TcpReceive();
tcpHelper.setReceiveEvent(tcpReceive);
handler = new MyHandler();
}
}
public void onSendMsgClick(View view){
try {
String iText=InputMsg.getText().toString();
tcpHelper.SendString(iText);
}catch (Exception e)
{

}
}
} ?

?

轉載于:https://www.cnblogs.com/WushiShengFei/p/7397947.html

總結

以上是生活随笔為你收集整理的Android Tcp操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。