实例介绍
【实例简介】
【实例截图】


【核心代码】
package com.example.Android_WiFiAP;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.util.Log;
import android.util.Pair;
import com.example.Android_WiFiAP.Utils.Util;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.*;
public class Server {
public static final String LOG_D = "Debug:Server";
private class Client extends AbstractClient {
protected Client(int _port, InetAddress _IPAddress, Socket _socket) {
super(_port, _IPAddress, _socket);
}
}
private final BlockingQueue<Pair<String, Client>> mMessageQueue;
private final BlockingQueue<String> mLocalMessageQueue;
public List<Client> mClients;
private Intent intent_for_chat;
private ThreadGroup mThreadGroup;
private final int mServerPort = 6666;
private ServerSocket mServerSocket;
private final int MAX_LENGTH_QUEUE = 1000;
private Handler mTextViewHandler;
private Thread mServerThread;
private Thread mServerRecv;
private Thread mServerClient;
private Context mContext;
private Client i_am_client;
private InetAddress mServer_ip;
private BroadcastReceiver receiver_for_queue;
public static final String PARAM_MESS_QUEUE = "mess";
public static final String BROADCAST_Server_FOR_QUEUE = "com.example.Android-Wi-Fi.Ap.server_queue";
public Server(Handler _handler, Context _context) {
mContext = _context;
intent_for_chat = new Intent(Server_Activity.BROADCAST_SERVER_ACTIVITY);
mThreadGroup = new ThreadGroup("my thread group");
mTextViewHandler = _handler;
mClients = new CopyOnWriteArrayList();
try {
mServer_ip = InetAddress.getByName(Util.getLocalIpAddressString());
} catch (UnknownHostException e) {
e.printStackTrace();
}
// mClients = Collections.synchronizedList(new LinkedList<Client>());
mMessageQueue = new ArrayBlockingQueue<Pair<String, Client>>(MAX_LENGTH_QUEUE);
mLocalMessageQueue = new ArrayBlockingQueue<String>(MAX_LENGTH_QUEUE);
receiver_for_queue = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String mess = intent.getStringExtra(PARAM_MESS_QUEUE);
mLocalMessageQueue.add(mess);
}
};
IntentFilter intFiltForBroadcast = new IntentFilter(BROADCAST_Server_FOR_QUEUE);
mContext.registerReceiver(receiver_for_queue, intFiltForBroadcast);
mServerThread = new Thread(mThreadGroup, new ServerThread());
mServerThread.start();
mServerRecv = new Thread(mThreadGroup, new ServerRecv());
mServerRecv.start();
mServerClient = new Thread(mThreadGroup, new ClientForServer());
mServerClient.start();
}
private synchronized void removeClient(Client _client) {
try {
_client.getSocket().close();
if (!mClients.remove(_client)) {
Log.d(LOG_D, "Error: Unsuccessful try to remove the client");
} else {
Log.d(LOG_D, "OK: Successful try to remove the client");
}
Log.d(LOG_D, "Count client after remove" mClients.size());
} catch (IOException e) {
Log.d(LOG_D, "Error I/O: close socket " e);
}
}
public synchronized void interruptAll() {
Log.d(LOG_D, "Main ServerThread interrupt " mThreadGroup.activeCount());
try {
if (mServerSocket != null)
mServerSocket.close();
} catch (IOException e) {
Log.d(LOG_D, "Hz cto");
}
mThreadGroup.interrupt();
}
private synchronized void closeSockets() {
for (Client client : mClients) {
removeClient(client);
}
try {
if (mServerSocket != null)
mServerSocket.close();
Log.d(LOG_D, "OK: Succesfull try to close the server socket");
} catch (IOException e) {
Log.d(LOG_D, "Error I/O: Unsuccesfull try to close the server socket");
}
}
private class ServerRecv implements Runnable {
@Override
public void run() {
ExecutorService pool = Executors.newFixedThreadPool(5);
while (!Thread.currentThread().isInterrupted() || !mMessageQueue.isEmpty()) {
try {
Pair<String, Client> pair = mMessageQueue.take();
Log.d(LOG_D, "Send message: " pair.first " from " pair.second);
Future f = pool.submit(new ServerSend(pair.second, mClients, pair.first));
intent_for_chat.putExtra(Server_Activity.SERVER_TYPE, Server_Activity.TYPE_SERVER_UPDATE_TEXTVIEW);
intent_for_chat.putExtra(Server_Activity.PARAM_MESS, pair.first);
mContext.sendBroadcast(intent_for_chat);
// mTextViewHandler.sendMessage(Util.getMessageFromString(pair.first, "msg"));
} catch (InterruptedException e) {
Log.d(LOG_D, "Ne doljno bit' (obrabotano v while,hota hz) " e);
mThreadGroup.interrupt();
}
}
pool.shutdown();
Log.d(LOG_D, "OK:Interrupt ServerRecv. Pool is shutdown");
}
private class ServerSend implements Runnable {
private Client clientFrom;
private List<Client> listClients;
private String mess;
private ServerSend(Client clientFrom, List<Client> _listClients, String mess) {
this.clientFrom = clientFrom;
this.listClients = _listClients;
this.mess = mess;
}
@Override
public void run() {
for (Client client : listClients) {
if (!(client.getPort() == clientFrom.getPort() && client.getIPAddress().equals(clientFrom.getIPAddress()))) {
try {
Util.send(client.getSocket(), mess);
Log.d(LOG_D, "Send to " client.getIPAddress().toString() client.getPort());
} catch (IOException e) {
Log.d(LOG_D, "Not send.Client is removed ip=" client.getIPAddress().toString());
}
}
}
}
}
}
private class ServerThread implements Runnable {
private ThreadGroup mThreadGroup_local;
public ServerThread() {
mThreadGroup_local = new ThreadGroup(mThreadGroup, "my thread group LOCAL");
}
@Override
public void run() {
try {
mServerSocket = new ServerSocket(getServerPort());
i_am_client = new Client(6666, mServer_ip, null);
while (!Thread.currentThread().isInterrupted()) {
Log.d(LOG_D, "Waiting for a client...");
Socket socket_new_client = mServerSocket.accept();
intent_for_chat.putExtra(Server_Activity.SERVER_TYPE, Server_Activity.TYPE_SERVER_UPDATE_TEXTVIEW);
intent_for_chat.putExtra(Server_Activity.PARAM_MESS, "client " socket_new_client.getInetAddress().toString());
mContext.sendBroadcast(intent_for_chat);
Client newClient = new Client(socket_new_client.getPort(), socket_new_client.getInetAddress(), socket_new_client);
mClients.add(newClient);
Log.d(LOG_D, "New client: " newClient.getIPAddress() " port=" newClient.getPort());
Log.d(LOG_D, "mClients.size()=" mClients.size());
ServerHandler mServerHandler = new ServerHandler(newClient);
Thread mServerHandlerThread = new Thread(mThreadGroup_local, mServerHandler);
mServerHandlerThread.start();
}
} catch (IOException e) {
Log.d(LOG_D, "IOException if an error occurs while creating the socket.\n" e);
} finally {
Log.d(LOG_D, "ServerThread block finally");
closeSockets();
}
Log.d(LOG_D, "Interrupt all Thread ServerThread2222");
mThreadGroup_local.interrupt();
}
private class ServerHandler implements Runnable {
private Client mClient;
private ServerHandler(Client mClient) {
this.mClient = mClient;
}
@Override
public void run() {
try {
InputStream sin = mClient.getSocket().getInputStream();
DataInputStream in = new DataInputStream(sin);
OutputStream sout = mClient.getSocket().getOutputStream();
DataOutputStream out = new DataOutputStream(sout);
String line = null;
while (!Thread.currentThread().isInterrupted()) {
line = in.readUTF(); // ожидаем пока клиент пришлет строку текста.
mMessageQueue.add(new Pair<String, Client>(line, mClient));
Log.d(LOG_D, "The dumb client just sent me this line : " line);
}
Log.d(LOG_D, "ServerHandler interrupted");
} catch (IOException e) {
Log.d(LOG_D, "OK:Error I/O " e);
} finally {
Util.sendToTextViewServer(mClient.getIPAddress() " was removed!", mContext);
Log.d(LOG_D, "Close client socket");
Log.d(LOG_D, "count clients = " mClients.size());
removeClient(mClient);//TODO: возможно не надо. посмотреть козда i/o exception кидает readUTF
}
}
}
}
private class ClientForServer implements Runnable {
private ClientForServer() {
}
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
final String mess = mLocalMessageQueue.take();
Log.d(ClientActivity.LOG_CLIENT, "Trying sending message mess = " mess);
mMessageQueue.add(new Pair<String, Client>(mess, i_am_client));
// pool.submit(new Runnable() {
// @Override
// public void run() {
// try {
// out.writeUTF(mess);
// out.flush();
// Log.d(ClientActivity.LOG_CLIENT, "OK send");
// } catch (IOException e) {
// Log.d(ClientActivity.LOG_CLIENT, "Error I/O when sending messege " e);
// }
// }
// });
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public int getServerPort() {
return mServerPort;
}
public int getCountClients() {
return mClients.size();
}
public AbstractClient getClient() {
assert mClients.size() > 0;
return mClients.get(0);
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论