本文将介绍关于CSocket,CServer类中如何处理客户端主动断开连接?的详细情况,特别是关于socket客户端断开重连的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主
本文将介绍关于CSocket,CServer类中如何处理客户端主动断开连接?的详细情况,特别是关于socket客户端断开重连的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于2014_7_25 关于 server 频繁主动断开、Android 客户端Socket 与 Java服务端ServerSocket 简单小例子、COCOS2DX APK客户端进入后台后自动断开,SOCKET连接的时间是230秒、Go WebSocket 如何处理断开连接?的知识。
本文目录一览:- 关于CSocket,CServer类中如何处理客户端主动断开连接?(socket客户端断开重连)
- 2014_7_25 关于 server 频繁主动断开
- Android 客户端Socket 与 Java服务端ServerSocket 简单小例子
- COCOS2DX APK客户端进入后台后自动断开,SOCKET连接的时间是230秒
- Go WebSocket 如何处理断开连接?
关于CSocket,CServer类中如何处理客户端主动断开连接?(socket客户端断开重连)
如何解决关于CSocket,CServer类中如何处理客户端主动断开连接??
class CServer : public CSocket
{
public:
CServer();
virtual ~CServer();
virtual void OnAccept(int nErrorCode);
public:
cclient *m_pClient = NULL;
};
class cclient : public CSocket
{
public:
cclient();
virtual ~cclient();
virtual void OnSend(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnClose(int nErrorCode);
};
当客户端断线时,我只想在CServer中处理,但现在会在cclient的OnClose函数中处理,这不是我想要的结果。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
2014_7_25 关于 server 频繁主动断开

在我的 server 与下位机(硬件设备,无操作系统)交互过程中,需要我给下位机配置命令。
如果是正常的逻辑,下位机开开启 server,我的程序去连接并发送操作命令,逻辑会非常简单。但是下位机的主从切换有很大困难,它或者只当主机,或者只作为从机。于是,软件这边做出了牺牲,写了很多恶心代码。哭..............
首先,我在程序中自建了一个消息队列,该队列中的内容为程序需要对下位机主动调用的命令。
然后,开启监听。 在接收到 cmd 端口的连接后,我建立一个线程,在此线程中我不断地去消息队列中取数据,根据消息的内容,决定给下位机发送什么命令。
在当前存在连接的情况下,若有新连接的到来,我会向队列中推一个 close thread 的命令,旧的线程取消息取到 close 命令时,就会安全退出线程。于此同时,在我的监听线程中我一直在等待旧的连接的退出,在 WaitForSingleObject 等待到需要的信号时,我开启一个新的线程,开启成功后给消息队列推入一条 set info 的命令。
现在的症状是在某些情况下,set info 后程序断开 socket,我真的怀疑与这个使用模式有关系。
待续.....
Android 客户端Socket 与 Java服务端ServerSocket 简单小例子
新建一个Java项目
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private final int SERVERPORT = 9898;//定义端口
private ServerSocket serverSocket; //声明服务器套接字
private OutputStream outputStream; //声明输出流
private InputStream inputStream; //声明输入流
private PrintWriter printWriter; //声明打印流
private Socket socket; //声明套接字
private BufferedReader reader; //声明缓冲流,用于读取接收的数据
public Server(){
try {
//根据指定端口号,创建套接字
serverSocket = new ServerSocket(SERVERPORT);
System.out.println("服务启动...");
socket = serverSocket.accept();//用accept()方法等待客户端的连接
System.out.println("客户端已连接...");
} catch (IOException e) {
e.printStackTrace();
}
try {
outputStream = socket.getOutputStream();//获取套接字输出流
inputStream = socket.getInputStream(); //获取套接字输入流
//根据输出流创建PrintWriter对象(用于写入数据)
printWriter = new PrintWriter(outputStream,true);
//根据输入流创建BufferedReader对象(用于读取数据)
reader = new BufferedReader(new InputStreamReader(inputStream));
/*
* 根据System.in创建BufferedReader对象
* BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
* 拆开为:
* InputStream is = System.in; //(System.in)接受从控制台输入的字节
* InputStreamReader isr = new InputStreamReader(in); //将字节流转换为字符流
* BufferedReader br = new BufferedReader(isr); //将字符流存入缓冲流
*/
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while(true){
String message = reader.readLine(); //读取客户端传输的信息
System.out.println("来自客户端的信息:" + message); //将接收的信息输出
if(message.equals("Bye")||message.equals("bye")) //如果信息为“Bye”或“bye”,则结束通信
break;
message = in.readLine(); //接受键盘输入
printWriter.println(message); //将接受的信息向客户端输出
}
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("客户端关闭连接...");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server();
}
}
新建一个Android项目:
其中Activity:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;
public class ClientActivity extends Activity implements Runnable,OnClickListener{
private TextView chatmessage; //用于显示聊天记录
private EditText sendmessage; //用于用户输入短信内容
private Button send_btn; //用于发送短信
private static final String HOST = "10.0.2.2";//服务器IP地址
private static final int PORT = 9898; //服务器端口号
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
private String str = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
chatmessage = (TextView) this.findViewById(R.id.chatmessage);
sendmessage = (EditText) this.findViewById(R.id.sendmessage);
send_btn = (Button) this.findViewById(R.id.send_btn);
send_btn.setOnClickListener(this);
new Thread(this).start();//启动线程
}
@Override
public void run() {
/*
* state>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*
* 这一坨代码本来是直接写在onCreate()中,但运行时报了android.os.NetworkOnMainThreadException错误,
* 后来根据园友的:https://www.cnblogs.com/lixiaolun/p/3472757.html 解决
*/
try {
//指定ip和端口号,创建套接字
socket = new Socket(HOST,PORT);
//使用套接字的输入流构造BufferedReader
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//使用套接字的输出流构造PrintWriter
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
writer = new PrintWriter(bw,true);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//end>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
try {
while(true){
//若套接字连接服务器,且输入流没有关闭
if(socket.isConnected()){
if(!socket.isInputShutdown()){
if((str = reader.readLine())!= null){
str += " ";
handler.sendMessage(handler.obtainMessage());
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClick(View arg0) {
if(arg0.getId() == R.id.send_btn){
//获取输入框内容
String message = sendmessage.getText().toString().trim();
//判断socket是否连接
if(socket.isConnected()){
//如果输出关闭,则不执行
if(socket.isOutputShutdown())
return;
writer.println(message);//将输出内容发送到服务器
//设置chatmessage内容
chatmessage.setText(chatmessage.getText()+"\n"+"发送:"+message);
//清空sendmessage的内容,以便下次输入
sendmessage.setText("");
}
}
}
public Handler handler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
chatmessage.setText(chatmessage.getText().toString()+"\n"+"来自服务器端的消息:" + str);
}
};
}
对应的 xml 布局文件(activity_client.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ClientActivity" >
<TextView
android:id="@+id/chatmessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:hint="聊天记录。。。" />
<EditText
android:id="@+id/sendmessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:hint="请输入..." />
<Button
android:id="@+id/send_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送" />
</LinearLayout>
还有AndroidManifest.xml 中记得申请权限:
<uses-permission android:name="android.permission.INTERNET"/><!-- 访问网络权限 -->
最后,先启动Java项目,然后在启动Android项目
注:如果运行报错,多半是IP地址对不上的问题,这需要自行百度
注:代码写的并不规范!!!
COCOS2DX APK客户端进入后台后自动断开,SOCKET连接的时间是230秒
COCOS2DX APK客户端进入后台后自动断开SOCKET连接的时间是230秒
经测,在不做任何设定的情况,COCOS2DX APK客户端进入后台后230秒自动断开SOCKET。
这个230是一个测试数值,不是官方数据。仅供其它需要的同行参考。
原文地址:http://5.quanpao.com/?p=721
Go WebSocket 如何处理断开连接?
go websocket 库提供 closehandler 机制来处理断开连接。当客户端关闭连接时,conn 类型触发 close 事件。使用 defer 语句注册 closehandler 函数可以监听该事件,接收 conn 和关闭原因常量。closehandler 函数被自动调用,提供处理断开连接和恢复应用程序的机会。
Go WebSocket:优雅地处理断开连接
在构建实时 Web 应用程序时,WebSocket 是一个强大的工具,用于在客户端和服务器之间进行双向通信。然而,处理客户端连接断开的情况至关重要,以保证应用程序的稳定性和可靠性。
处理断开连接
Go WebSocket 库为处理断开连接提供了内置机制。当客户端关闭连接时,[Conn](https://pkg.go.dev/
要监听此事件,可以使用 defer 语句将 [CloseHandler](https://pkg.go.dev/github.com/gorilla/websocket#CloseHandler) 函数注册到 WebSocket 连接:
import ( "github.com/gorilla/websocket" ) func handleConnection(ws *websocket.Conn) { defer ws.CloseHandler()(ws, websocket.CloseNormalClosure) // ... }
CloseHandler 函数接受两个参数:*Conn 和一个表示关闭原因的常量(例如 websocket.CloseNormalClosure 表示正常关闭)。当连接被关闭时,该函数将被自动调用。
实战案例
以下是一个处理断开连接的简单实战案例:
package main import ( "fmt" "github.com/gorilla/websocket" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ws, err := websocket.Upgrade(w, r, nil, nil, nil) if err != nil { fmt.Printf("upgrade error: %v", err) return } defer ws.CloseHandler()(ws, websocket.CloseNormalClosure) // 监听消息和断开连接事件 go func() { for { _, _, err := ws.ReadMessage() if err != nil { // 处理错误(例如连接断开) return } } }() }) http.ListenAndServe(":8080", nil) }
在处理断开连接方面,CloseHandler 提供了一种简单而优雅的方式,可以帮助应用程序从客户端断开事件中恢复并继续正常运行。
以上就是Go WebSocket 如何处理断开连接?的详细内容,更多请关注php中文网其它相关文章!
关于关于CSocket,CServer类中如何处理客户端主动断开连接?和socket客户端断开重连的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于2014_7_25 关于 server 频繁主动断开、Android 客户端Socket 与 Java服务端ServerSocket 简单小例子、COCOS2DX APK客户端进入后台后自动断开,SOCKET连接的时间是230秒、Go WebSocket 如何处理断开连接?等相关内容,可以在本站寻找。
本文标签: