Android tcp socket sample示例

发布于:2025-07-27 ⋅ 阅读:(15) ⋅ 点赞:(0)

Android tcp socket sample示例

抄了菜鸟的java socket示例,在android模拟器上测试无误:
https://www.runoob.com/java/java-socket-class.html

不要忘记在client 和 server的AndroidManifest里添加网络权限

Server sample

package com.example.socketservertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends Activity {

    private HandlerThread handlerThread;
    private Handler mHandler;
    private static final String LOG_TAG = "SocketServerTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_create_server).setOnClickListener(onClickListener);

        handlerThread = new HandlerThread("SocketClientTest_thread");
        handlerThread.start();
        mHandler = new MyHandler(handlerThread.getLooper());
    }

    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_create_server:
                    mHandler.sendEmptyMessage(MSG_CREATE_SERVER);
                    break;
                default:
                    break;
            }
        }
    };

    private static final int MSG_CREATE_SERVER = 0;

    private class MyHandler extends Handler {
        MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_CREATE_SERVER:
                    createSocketServer();
                    break;
                default:
                    break;
            }
        }
    }

    private static final int PORT = 4003;

    private void createSocketServer() {

        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        try {
            Log.d(LOG_TAG, "Server starting...");
            // 1. 创建 ServerSocket,监听指定端口
            serverSocket = new ServerSocket(PORT);
            Log.d(LOG_TAG, "Server started. Waiting for client...");

            // 2. 等待客户端连接
            clientSocket = serverSocket.accept();
            Log.d(LOG_TAG, "Client connected.");

            // 3. 获取输入流,读取客户端消息
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
            while (true) {
                String message = in.readLine();
                Log.d(LOG_TAG, "Client says: " + message);
                if (message == null) {
                    // client disconnected.
                    break;
                }
            }


            // 4. 获取输出流,向客户端发送响应
            /*PrintWriter out = new PrintWriter(
                    clientSocket.getOutputStream(), true);
            out.println("Hello Client!");*/

            // 5. 关闭连接

        } catch (IOException ex) {
            Log.w(LOG_TAG, "createSocketServer error", ex);
            if (null != clientSocket) {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                }
            }
            if (null != serverSocket) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                }
            }
        }
    }
}

layout xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_create_server"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginTop="100dp"
        android:text="btn_create_server"
        android:textSize="25sp"/>

</LinearLayout>

Client sample

package com.example.socketclienttest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

public class MainActivity extends Activity {

    private HandlerThread handlerThread;
    private Handler mHandler;
    private static final String LOG_TAG = "SocketClientTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_connect).setOnClickListener(onClickListener);
        findViewById(R.id.btn_disconnect).setOnClickListener(onClickListener);
        findViewById(R.id.btn_send_msg).setOnClickListener(onClickListener);

        handlerThread = new HandlerThread("SocketClientTest_thread");
        handlerThread.start();
        mHandler = new MyHandler(handlerThread.getLooper());
    }

    int count = 0;
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_connect:
                    mHandler.sendEmptyMessage(MSG_CONNECT);
                    break;
                case R.id.btn_disconnect:
                    mHandler.sendEmptyMessage(MSG_DISCONNECT);
                    break;
                case R.id.btn_send_msg:
                    Message message = mHandler.obtainMessage(MSG_SEND_MSG);
                    message.obj = "msg_" + count;
                    mHandler.sendMessage(message);
                    count++;
                    break;
                default:
                    break;
            }
        }
    };

    private static final int MSG_CONNECT = 0;
    private static final int MSG_SEND_MSG = 1;
    private static final int MSG_DISCONNECT = 2;

    private class MyHandler extends Handler {
        MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_CONNECT:
                    connectToSocketServer();
                    break;
                case MSG_DISCONNECT:
                    disconnectFromSocketServer();
                    break;
                case MSG_SEND_MSG:
                    String data = (String) msg.obj;
                    sendDataToServer(data);
                    break;
                default:
                    break;
            }
        }
    }

    private static final String IP = "localhost";
    private static final int PORT = 4003;
    PrintWriter out;
    BufferedReader in;
    Socket socket;

    private void connectToSocketServer() {
        try {
            // 1. 创建 Socket 连接
            socket = new Socket();
            // 设置读取超时为 3 秒
            socket.setSoTimeout(3000);
            socket.setKeepAlive(true);

            Log.d(LOG_TAG, "start connect, IP:" + IP + ", PORT:" + PORT);
            // 设置连接超时为 5 秒
            socket.connect(new InetSocketAddress(IP, PORT), 5000);
            Log.d(LOG_TAG, "connect success.");

            // 2. 获取输出流,向服务器发送数据
            out = new PrintWriter(socket.getOutputStream(), true);
            //out.println("Hello Server!");

            // 3. 获取输入流,接收服务器响应
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
           /* String response = in.readLine();
            System.out.println("Server response: " + response);*/

        } catch (IOException ex) {
            Log.w(LOG_TAG, "connectToSocketServer error", ex);
            socket = null;
        }
    }

    private void disconnectFromSocketServer() {
        try {
            socket.close();
        } catch (IOException ex) {
            Log.w(LOG_TAG, "disconnectFromSocketServer error", ex);
            socket = null;
        }
    }

    private void sendDataToServer(String msg) {
        Log.d(LOG_TAG, "client sending msg:" + msg);
        out.println(msg);
    }


}

layout xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_connect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginTop="100dp"
        android:text="btn_connect"
        android:textSize="25sp"/>

    <Button
        android:id="@+id/btn_send_msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginTop="10dp"
        android:text="btn_send_msg"
        android:textSize="25sp"/>

    <Button
        android:id="@+id/btn_disconnect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_marginTop="10dp"
        android:text="btn_disconnect"
        android:textSize="25sp"/>

</LinearLayout>

----------------------------- end line --------------------------------------------


网站公告

今日签到

点亮在社区的每一天
去签到