GVKun编程网logo

关于CSocket,CServer类中如何处理客户端主动断开连接?(socket客户端断开重连)

7

本文将介绍关于CSocket,CServer类中如何处理客户端主动断开连接?的详细情况,特别是关于socket客户端断开重连的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主

本文将介绍关于CSocket,CServer类中如何处理客户端主动断开连接?的详细情况,特别是关于socket客户端断开重连的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于2014_7_25 关于 server 频繁主动断开、Android 客户端Socket 与 Java服务端ServerSocket 简单小例子、COCOS2DX APK客户端进入后台后自动断开,SOCKET连接的时间是230秒、Go WebSocket 如何处理断开连接?的知识。

本文目录一览:

关于CSocket,CServer类中如何处理客户端主动断开连接?(socket客户端断开重连)

关于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 频繁主动断开

2014_7_25 关于 server 频繁主动断开

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

    在我的 server 与下位机(硬件设备,无操作系统)交互过程中,需要我给下位机配置命令。

    如果是正常的逻辑,下位机开开启 server,我的程序去连接并发送操作命令,逻辑会非常简单。但是下位机的主从切换有很大困难,它或者只当主机,或者只作为从机。于是,软件这边做出了牺牲,写了很多恶心代码。哭..............

    首先,我在程序中自建了一个消息队列,该队列中的内容为程序需要对下位机主动调用的命令。

    然后,开启监听。 在接收到 cmd 端口的连接后,我建立一个线程,在此线程中我不断地去消息队列中取数据,根据消息的内容,决定给下位机发送什么命令。    

    在当前存在连接的情况下,若有新连接的到来,我会向队列中推一个 close thread 的命令,旧的线程取消息取到 close 命令时,就会安全退出线程。于此同时,在我的监听线程中我一直在等待旧的连接的退出,在 WaitForSingleObject 等待到需要的信号时,我开启一个新的线程,开启成功后给消息队列推入一条 set info 的命令。

    现在的症状是在某些情况下,set info 后程序断开 socket,我真的怀疑与这个使用模式有关系。

    

    待续.....

   


    


Android 客户端Socket 与 Java服务端ServerSocket 简单小例子

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客户端进入后台后自动断开SOCKET连接的时间是230秒
Posted in : COCOS2D-Xon 2014 年 5 月 15 日
by : qifenshu
Comments: 0.

经测,在不做任何设定的情况,COCOS2DX APK客户端进入后台后230秒自动断开SOCKET。

这个230是一个测试数值,不是官方数据。仅供其它需要的同行参考。

原文地址:http://5.quanpao.com/?p=721

Go WebSocket 如何处理断开连接?

Go WebSocket 如何处理断开连接?

go websocket 库提供 closehandler 机制来处理断开连接。当客户端关闭连接时,conn 类型触发 close 事件。使用 defer 语句注册 closehandler 函数可以监听该事件,接收 conn 和关闭原因常量。closehandler 函数被自动调用,提供处理断开连接和恢复应用程序的机会。

Go WebSocket 如何处理断开连接?

Go WebSocket:优雅地处理断开连接

在构建实时 Web 应用程序时,WebSocket 是一个强大的工具,用于在客户端和服务器之间进行双向通信。然而,处理客户端连接断开的情况至关重要,以保证应用程序的稳定性和可靠性。

处理断开连接

Go WebSocket 库为处理断开连接提供了内置机制。当客户端关闭连接时,[Conn](https://pkg.go.dev/github.com/gorilla/websocket#Conn) 类型会触发 Close 事件。

要监听此事件,可以使用 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 如何处理断开连接?等相关内容,可以在本站寻找。

本文标签: