Server 端:
1 通过handler 与activity 通信。
2 启动一个thread, 等待client 连接和接收数据。
public class SocketServer implements Runnable{
private static final String TAG = "SocketServer";
private Context mContext;
private boolean mStop = false;
private Handler mHandler;
ServerSocket mServerSocket;
//handler 是activity 主线程的,用于socket 收到数据后用handler message通知activity
public SocketServer(Context context, Handler handler){
mContext = context;
mHandler = handler;
try{
mServerSocket = new ServerSocket(8001);
//启动一个thread 去等待客户端连接, 和接收数据
//更据需要也可以等客户端连接后,也可以启动一个thread去发送数据
Thread th = new Thread(this);
th.start();
}catch (IOException e){
Log.i(TAG, "IOException e="+e);
}
}
@Override
public void run() {
byte[] bytes = new byte[100];
try{
while (!mStop) {
//等待客户端连接
Socket socket = mServerSocket.accept();
Log.i(TAG, "socket accept");
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
while (!mStop) {
//while 循环, 不停接收数据
int len = inputStream.read(bytes);
if (len == -1) {
//客户端已断开, 跳出这层循环,重新等待客户端
Log.i(TAG, "socket disconnected");
break;
}
String str = new String(bytes);
Log.i(TAG, "read str=" + str + "; len = " + len);
Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_SOCKET_UPDATE);
//通过handler, 通知数据到activity
Bundle data = new Bundle();
data.putString("data", str);
msg.setData(data);
mHandler.sendMessage(msg);
}
}
mServerSocket.close();
mServerSocket = null;
Log.i(TAG,"serverSocket.close");
}catch (IOException e){
Log.i(TAG, "IOException e="+e);
}
}
//activity 退出, 关闭socket server
public void destroy(){
Log.i(TAG,"destroy");
mStop = true;
if(mServerSocket != null){
try {
mServerSocket.close();
Log.i(TAG,"serverSocket.close");
}catch (IOException e){
Log.i(TAG, "IOException e="+e);
}
}
}
}
Client 端:
1 activity 会传handler进来, 用于和activity的通信
2 启动一个thread去连接server, 和发送数据。 当连接到server后,thread 会启动Looper 来等待activity的发送数据
Looper.prepare();
mHandleThread = new Handler(){
@Override
public void handleMessage(Message msg) {}
}
};
Looper.loop();
public class SocketClient implements Runnable{
private static final String TAG = "SocketClient";
private String mAddress;
private int mPort;
private boolean isStop = false;
private Socket mSocket;
private Handler mHandleThread;
private String mResult;
private Handler mHandler;
//handler 来自调用的activity
//用于通知activity server 连接状态或其它沟通(来自server的数据)
public SocketClient(Handler handler, String address, int port){
mContext = context;
mAddress = address;
mPort = port;
mHandler = handler;
connectWeb();
}
private void connectWeb() {
//启动一个thread去连接server, 和发送数据
Thread th = new Thread(this);
th.start();
}
@Override
public void run() {
while (!isStop) {
try {
//连接server
mSocket = new Socket(mAddress, mPort);
final OutputStream outputStream = mSocket.getOutputStream();
Log.i(TAG, "web connected");
Message msg = mHandler.obtainMessage(InputKubeColors.MESSAGE_WEB_STATE);
msg.arg1 = 0;
mHandler.sendMessage(msg);
//启动一个Looper 和handler 用于处理activity的数据发送
Looper.prepare();
mHandleThread = new Handler(){
@Override
public void handleMessage(Message msg) {
if(mResult != null && !mResult.isEmpty()){
byte [] bytes = mResult.getBytes();
try {
outputStream.write(bytes, 0, mResult.length());
}catch (IOException e){
}
}
}
};
Looper.loop();
mSocket.close();
Log.i(TAG, "web socket close");
return;
} catch (IOException e) {
}
//server 连接失败,或断开,等待3秒,重新连接。
try {
Thread.sleep(3000);
}catch (InterruptedException e){
}
}
}
//给activity调用的发送数据的方法
//通过thread的handler发消息到thread的looper,去发送
public void send(String result){
mResult = result;
if(mHandleThread != null) {
mHandleThread.sendEmptyMessage(1);
}
}
//结束socket client, 调用mHandleThread.getLooper().quit(); 退出Looper 结束thread
public void destroy(){
Log.d(TAG,"destroy");
isStop = true;
if(mHandleThread != null) {
mHandleThread.getLooper().quit();
mHandleThread = null;
}
}
}
本文详细介绍了Socket通信的基本原理,包括Server端与Client端的实现方式。Server端通过创建ServerSocket监听特定端口,接收Client连接请求并进行数据交换。Client端则主动发起连接,并通过Socket发送数据。文章还展示了如何利用Handler机制在Activity与Socket间建立通信,确保数据的实时更新。
1412

被折叠的 条评论
为什么被折叠?



