Scoket 客户端收消息 阻塞问题 socketandroid客户端长连接优化 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不明白你为什么要使用synchronized,我在写程序时不用synchronized直接写没有出现过这样的问题。另外为什么要每次开这么大的buffer呢? 客户端每个线程都是独立的 一般不需要加 synchronized 关键字。 楼主设置的buffer实在是太大了,一般1024或者512就可以了。你设置的居然有8K。 buffer 本身就是byte数组为什么要转来转去的 /** * 运行Socket通信的线程 * @author TCK-001 * @version 1.0 */@SuppressLint("HandlerLeak")public final class SocketThread extends Thread { public void run() { try { while (true) { if (!SocketManager.get().isStart()) { return; } ServerSocket sever = SocketManager.get().getSocket(); if (null == sever || sever.isClosed()) { return; } new ReadSocket(sever.accept()).start(); } } catch (Exception e) { Log.e("AbstractActivity", "Socket已经被回收"); } } /** * 读取Socket并解析 * @author TCK-001 * @version 1.0 */ public class ReadSocket extends Thread { private Socket socket; public ReadSocket(Socket socket) { this.socket = socket; } public void run() { try { String jsonStr = FileUtil.get().readFile(socket.getInputStream(), HTTP.UTF_8, 1, false); socket.close(); JSONObject json = new JSONObject(jsonStr); if (json.getLong("memberId") == Container.member.getId() && Container.socketKey.equals(json.getString("socketKey")) && SettingService.get().getSetting(SettingService.RECEIVE_MSG)) { Bundle bundle = new Bundle(); bundle.putInt("type", json.getInt("type")); bundle.putString("data", json.getJSONObject("data").toString()); Message message = new Message(); message.setData(bundle); TckApp.get().getLastAct(null).socketHandler.sendMessage(message); } } catch (Exception e) { Log.e("AbstractActivity", "接收Socket消息,解析json", e); } } }} /** * Socket的管理器 * @author TCK-001 * @version 1.0 */public final class SocketManager { private SocketManager() {} private static SocketManager bean = new SocketManager(); private boolean start = false; private ServerSocket socket; /** * 单例模式获得bean * @return */ public static SocketManager get() { return bean; } /** * 启动所有的Socket * */ public void start() { if (null == Container.member || !ViewUtil.get().isNet() || start) { return; } getStartThread().start(); } /** * 结束Socket * */ public void end() { start = false; try { if (null != socket) { socket.close(); socket = null; } } catch (Exception e) { Log.e("AbstractActivity", "关闭Socket", e); } } private Thread getStartThread() { return new Thread() { public void run() { try { Container.socketPort = getPort(); ToolUtil tool = new ToolUtil(Domain.LONG_REQUEST_TIME, TckUrls.POINT_SET_SOCKET_URL); Container.socketKey = tool.md5(tool.getRandom(4)); Map<String, Object> param = tool.createMap(new String[] { "ip", "port", "socketKey" }, new Object[] { tool.getLocalIp(), Container.socketPort, Container.socketKey }); tool.requestTck(param, false); start = true; new SocketThread().start(); Log.e("AbstractActivity", "Socket已经开启"); } catch (Exception e) { Log.e("AbstractActivity", "开启Socket", e); } } }; } // 获得一个随机端口 private int getPort() { int port = 0; while (true) { port = 10000 + Integer.parseInt(ToolUtil.get().getRandom(4)); try { socket = new ServerSocket(port); break; } catch (Exception e) { Log.e("AbstractActivity", "端口[" + port + "]已被占用", e); } } return port; } /** * 是否正在运行socket * @return */ public boolean isStart() { return start; } /** * 获得socket监听 * @return */ public ServerSocket getSocket() { return socket; }} 8K不是个问题吧他写8,可能是考虑字节与bit的转换关系。不过byte本身就是字节了。 有人能够帮我吗??? android手机管理软件怎么实现的 1280*800的图片放在1280*800的pad中,为什么会模糊 关于用setContentView切换layout的疑惑 运用Proxy模式简化的Service的管理和使用的实例(附源码及工程文件) 获取文件路径问题 怎么删除 repo 下来的 android 源码 Android 2.3写文件问题(4.0可行,快崩溃了,求大神!) Android 关机时间 问一个关于MediaPlayer的问题 listview+checkbox +下拉刷新 焦点问题 android 如何实现listview嵌套?
一般1024或者512就可以了。你设置的居然有8K。
* 运行Socket通信的线程
* @author TCK-001
* @version 1.0
*/
@SuppressLint("HandlerLeak")
public final class SocketThread extends Thread { public void run() {
try {
while (true) {
if (!SocketManager.get().isStart()) {
return;
}
ServerSocket sever = SocketManager.get().getSocket();
if (null == sever || sever.isClosed()) {
return;
}
new ReadSocket(sever.accept()).start();
}
} catch (Exception e) {
Log.e("AbstractActivity", "Socket已经被回收");
}
}
/**
* 读取Socket并解析
* @author TCK-001
* @version 1.0
*/
public class ReadSocket extends Thread {
private Socket socket;
public ReadSocket(Socket socket) {
this.socket = socket;
}
public void run() {
try {
String jsonStr = FileUtil.get().readFile(socket.getInputStream(), HTTP.UTF_8, 1, false);
socket.close();
JSONObject json = new JSONObject(jsonStr);
if (json.getLong("memberId") == Container.member.getId() && Container.socketKey.equals(json.getString("socketKey"))
&& SettingService.get().getSetting(SettingService.RECEIVE_MSG)) {
Bundle bundle = new Bundle();
bundle.putInt("type", json.getInt("type"));
bundle.putString("data", json.getJSONObject("data").toString());
Message message = new Message();
message.setData(bundle);
TckApp.get().getLastAct(null).socketHandler.sendMessage(message);
}
} catch (Exception e) {
Log.e("AbstractActivity", "接收Socket消息,解析json", e);
}
}
}}
* Socket的管理器
* @author TCK-001
* @version 1.0
*/
public final class SocketManager {
private SocketManager() {}
private static SocketManager bean = new SocketManager();
private boolean start = false;
private ServerSocket socket;
/**
* 单例模式获得bean
* @return
*/
public static SocketManager get() {
return bean;
}
/**
* 启动所有的Socket
* */
public void start() {
if (null == Container.member || !ViewUtil.get().isNet() || start) {
return;
}
getStartThread().start();
}
/**
* 结束Socket
* */
public void end() {
start = false;
try {
if (null != socket) {
socket.close();
socket = null;
}
} catch (Exception e) {
Log.e("AbstractActivity", "关闭Socket", e);
}
}
private Thread getStartThread() {
return new Thread() {
public void run() {
try {
Container.socketPort = getPort();
ToolUtil tool = new ToolUtil(Domain.LONG_REQUEST_TIME, TckUrls.POINT_SET_SOCKET_URL);
Container.socketKey = tool.md5(tool.getRandom(4));
Map<String, Object> param = tool.createMap(new String[] { "ip", "port", "socketKey" },
new Object[] { tool.getLocalIp(), Container.socketPort, Container.socketKey });
tool.requestTck(param, false);
start = true;
new SocketThread().start();
Log.e("AbstractActivity", "Socket已经开启");
} catch (Exception e) {
Log.e("AbstractActivity", "开启Socket", e);
}
}
};
}
// 获得一个随机端口
private int getPort() {
int port = 0;
while (true) {
port = 10000 + Integer.parseInt(ToolUtil.get().getRandom(4));
try {
socket = new ServerSocket(port);
break;
} catch (Exception e) {
Log.e("AbstractActivity", "端口[" + port + "]已被占用", e);
}
}
return port;
} /**
* 是否正在运行socket
* @return
*/
public boolean isStart() {
return start;
} /**
* 获得socket监听
* @return
*/
public ServerSocket getSocket() {
return socket;
}}
他写8,可能是考虑字节与bit的转换关系。不过byte本身就是字节了。