Android tcp socket sample示例
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";@Overrideprotected 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() {@Overridepublic 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);}@Overridepublic 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"><Buttonandroid: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";@Overrideprotected 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() {@Overridepublic 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);}@Overridepublic 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"><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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 --------------------------------------------