Android实现Tcp client端(java)

该代码示例展示了如何使用 Java 实现一个 TCP 客户端,包括连接服务器、发送与接收 JSON 数据、数据同步标志以及断开连接的功能。在 `MainActivity` 中创建客户端实例并进行连接,发送字符串数据,并获取服务器响应。
摘要由CSDN通过智能技术生成

TCPClient .java

package com.example.testtcp;

import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class TCPClient {
    private static final String TAG = "TCPClient";

    private String ip;
    private int port;

    private Socket mSocket;
    private SocketAddress mSocketAddress;
    private OutputStream mOutputStream;
    private InputStream mInputStream;
    private ReadThread mReadThread;
    private boolean _isConnected = false;
	private boolean syncDataFlag = false;
	private String mData;

    public TCPClient(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }


    public void connect() {
        try {
            Log.d(TAG, "connect: start");
            this.mSocket = new Socket();
            this.mSocket.setKeepAlive(true);
            this.mSocketAddress = new InetSocketAddress(ip, port);
            this.mSocket.connect( mSocketAddress, 10000);// 设置连接超时时间为10秒
            this.mOutputStream = mSocket.getOutputStream();
            this.mInputStream = mSocket.getInputStream();

            this.mReadThread = new TCPClient.ReadThread();
            this.mReadThread.start();
            this._isConnected = true;

            Log.d(TAG, "connect: start");
        } catch (IOException e) {
            e.printStackTrace();
            Log.e(TAG, "connect: " +e);
            Log.d(TAG, "connect: fail");
        }
    }



    public String getData() {
        while (!syncDataFlag) {
                Thread.sleep(500);
        }
        return mData;
    }

    public void close() {

        if (this.mReadThread != null) {
            this.mReadThread.interrupt();
        }
        if (this.mSocket != null) {
            try {
                this.mSocket.close();
                this.mSocket = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        this._isConnected = false;
    }

    public boolean isConnected() {
        return this._isConnected;
    }


    public void send(String testData) {
        try {
            byte[] msg = testData.getBytes();
            byte[] len = intToByteArray(msg.length);
            byte[] messageBody = new byte[len.length +msg.length];
            System.arraycopy(len, 0, messageBody, 0, len.length);
            System.arraycopy(msg, 0, messageBody, len.length, msg.length);
            this.mOutputStream.write(messageBody);
            Log.d(TAG, "SyncScenarioEngine: write end");
            
        } catch (Exception e) {
            Log.e(TAG, "connect: " +e);
        }
    }

    private class ReadThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                try {
                    if (TCPClient.this.mInputStream == null) {
                        return;
                    }
                    int available = TCPClient.this.mInputStream.available();
                    if (available > 0) {

                        byte[] buffer = new byte[1024];
                        int size = mInputStream.read(buffer);
                        if (size > 0) {
                            syncScenarioListFlag = true;
                            byte[] len = new byte[4];
                            System.arraycopy(buffer, 0, len, 0, len.length);
                            byte[] megBody = new byte[buffer.length - len.length];
                            System.arraycopy(buffer, len.length, megBody, 0, megBody.length);
                            JSONObject jsonObj = new JSONObject(new String(megBody));
                            mData = String.valueOf(jsonObj.getJSONArray("params"));
							syncDataFlag = true;
                        }
                    } else {
                          Thread.sleep(10);
                    }
                } catch (Throwable e) {
                    System.out.println(e.getMessage());
                    return;
                }
            }
        }
    }
	
	private byte[] intToByteArray(int i) {
        byte[] result = new byte[4];
        //由高位到低位
        result[0] = (byte)((i >> 24) & 0xFF);
        result[1] = (byte)((i >> 16) & 0xFF);
        result[2] = (byte)((i >> 8) & 0xFF);
        result[3] = (byte)(i & 0xFF);
        return result;
    }

    private int byteArrayToInt(byte[] bytes) {
        int value=0;
        //由高位到低位
        for(int i = 0; i < 4; i++) {
            int shift= (4-1-i) * 8;
            value +=(bytes[i] & 0x000000FF) << shift;//往高位游
        }
        return value;
    }
}

MainActivity.java

package com.example.scenariotcp;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "TCPClient";
    private TCPClient tcpClient = null;
    private String ip = "192.168.100.108";
    private int port = 35100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate: statrt ");
        tcpClient = new TCPClient(ip, port);
        tcpClient.connect();//连接TCPServer
        if (tcpClient.isConnected()) {
            Log.d(TAG, "onCreate: isconnect ");
            //发送数据
            String outContent = "TCPClient say hello";
            String data = tcpClient.send(outContent);
            Log.d(TAG, "onCreate: data = " + tcpClient.getData);
        }

        Log.d(TAG, "onCreate: end ");
        //关闭连接
        tcpClient.close();
    }
}
以下是一个简单的TCP ServerJava实现: ```java import java.io.*; import java.net.*; public class TCPServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8080); // 创建ServerSocket对象,指定监听口 System.out.println("Server started."); while (true) { Socket clientSocket = serverSocket.accept(); // 监听客户的连接请求 System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress()); InputStream inputStream = clientSocket.getInputStream(); // 获取输入流 OutputStream outputStream = clientSocket.getOutputStream(); // 获取输出流 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); // 输入流读取器 PrintWriter writer = new PrintWriter(outputStream, true); // 输出流写入器,设置为自动刷新 String message = reader.readLine(); // 读取客户发送过来的消息 System.out.println("Received message: " + message); writer.println("Server received message: " + message); // 向客户发送消息 clientSocket.close(); // 关闭连接 System.out.println("Client disconnected."); } } } ``` 在该实现中,创建了一个ServerSocket对象来监听指定口的连接请求。一旦有客户连接,就获取到该客户的Socket对象,获取其输入输出流,然后进行消息的读取和发送,最后关闭连接并等待下一个连接请求。 需要注意的是,在实际的应用中,需要在一个单独的线程中进行Socket对象的监听和数据的处理,否则会导致主线程阻塞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值