在断网或服务器未开启的情况下,客户端多次点击 连接按钮创建了多个连接,如何解决啊?

irly01 2018-01-11 04:59:47
private void connectThread() {
socketConnectThread=new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare(); // 将当前线程初始化为Looper线程
edtIP = sharedPreferences.getString("IP", "192.168.43.168");
edtPort = sharedPreferences.getString("PORT", "8080");
connectServer(edtIP, edtPort);
// Looper.loop(); // 开始循环处理消息队列,可删,是我添加的
}
});
socketConnectThread.start();
}
}
private void connectServer(String ip, String port) {
mSocket = new Socket(ip, Integer.parseInt(port));
}

在断网或服务器未开启的情况下,客户端多次点击 连接按钮 运行connectThread()函数,然后开启服务端时发现客户端创建了多个连接,但是如果先开启服务端,多次点击连接按钮并不会创建多个连接,没问题。这该如何解决啊?

public void stopSocket() {
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
}
即使我在点击连接按钮时提前运行 stopSocket()方法也没效果啊。

...全文
775 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
irly01 2018-06-07
  • 打赏
  • 举报
回复
引用 8 楼 qq_38074369 的回复:
服务器没开,不应该直接报错吗 java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at java.net.Socket.<init>(Socket.java:434) at java.net.Socket.<init>(Socket.java:211) at com.wkp.simple.util.ClientHelper$ClientRunnable.run(ClientHelper.java:125) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
是先开服务器,再手动关闭服务器或拔网线,前提是在“”socket超时的范围内“”,才出现这问题
wkp111 2018-01-15
  • 打赏
  • 举报
回复
服务器没开,不应该直接报错吗 java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at java.net.Socket.<init>(Socket.java:434) at java.net.Socket.<init>(Socket.java:211) at com.wkp.simple.util.ClientHelper$ClientRunnable.run(ClientHelper.java:125) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
Smoyan_ 2018-01-15
  • 打赏
  • 举报
回复
你这逻辑不严谨,进行连接操作的时候需要有Callback回调,用来接收连接过程的回调,然后在接收连接结束或者失败或者hi超时后才能开始接着发
Jing丶無雙 2018-01-12
  • 打赏
  • 举报
回复
当点击连接按钮时,在调用 connectThread()函数前
button.setEnabled(false)  //关闭连接按钮
在你的Socket连接服务器取得响应后
button.setEnabled(true)  //开启连接按钮
这样在断网或服务器未开启的情况下,客户端就无法多次点击 连接按钮
irly01 2018-01-12
  • 打赏
  • 举报
回复
引用 5 楼 jklwan 的回复:
connectServer中判断Socket状态,如果是null才初始化,否则先stopSocket()再初始化。
我试过了,没效果,强制null也不行,利用mSocket.setSoTimeout(3000);怎没问题了,但是在3000ms内还有这个问题啊!
jklwan 2018-01-12
  • 打赏
  • 举报
回复
connectServer中判断Socket状态,如果是null才初始化,否则先stopSocket()再初始化。
irly01 2018-01-12
  • 打赏
  • 举报
回复
看来只能利用mSocket.setSoTimeout(3000);来解决了。
irly01 2018-01-12
  • 打赏
  • 举报
回复
我发现服务器虽然创建了多个连接,但只有最近的一个连接可以和客户端通信。 private void connectServer(String ip, String port) { try { mSocket = new Socket(ip, Integer.parseInt(port)); out = mSocket.getOutputStream(); in = mSocket.getInputStream(); Log.v(this.getClass().getName(), "连接成功"); } catch (Exception e) { isConnected = false; Log.e(this.getClass().getName(), "连接失败"); } } 虽然能通讯但这时客户端并知道自己已连接啊?
irly01 2018-01-12
  • 打赏
  • 举报
回复
button.setEnabled这个方式我已经实现过了,在有网络且服务器提前开启的情况下button.setEnabled可以实现。 问题是这是在断网的情况下,连续点击n次,然后短时间内开启服务器,服务器开启了n个连接。 我试过每次点击连接按钮前运行socketConnectThread.stop()方法,没效果。

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧