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 --------------------------------------------