在 client/server 应用程序中阻止 c 中的读取函数

Blocking read function in c in a client/server application

我目前正在开发平板电脑(客户端)和 MAC/PC(服务器)之间的 client/server 架构。我正在两边做一些实时渲染,我需要两者之间的通信。

问题是我需要对从客户端获得的字符串(基本上是一个旋转矩阵)进行一些操作。因此,该字符串最多为 16 个浮点数,我之前将其转换为逗号分隔值字符串。 因此,我应该从我的客户那里得到的是:

1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0

服务器端,我对该字符串进行了一些处理,以将我的旋转矩阵作为包含 16 个元素的浮点数组返回。问题是有时我从服务器端的客户端一次获得的元素不止 16 个。例如我得到

1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0

所以当我尝试拆分它时,我超出了 16 个元素的限制,这对我来说一点都不好。 我的问题是:有没有办法防止服务器 and/or 客户端一次 read/send 多个完整矩阵?由于我使用平板电脑和一些实时渲染,我希望能够尽可能节省处理能力。

这是我正在使用的代码(因为文件很大,只是一些片段)

客户:

if (connected == true && matrixupdated == true && this.hasMatrixChanged()){
            try {
                this.inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                this.outToServer= new DataOutputStream(clientSocket.getOutputStream());
                this.sentence = this.getStringFromMatrix();
                outToServer.writeBytes(sentence + '\n');
                this.hasServerProcessed = false ;
                System.arraycopy(matrix, 0, previousMatrix, 0, 16); //I check whether the matrix changes enough for me to send it to the server
            }catch (Exception e) {
                Log.e("ClientActivity", "S: Error", e);
            }
            this.matrixupdated = false ;

服务器:

while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
{
    smatrix = client_message ;  //smatrix is a true c++ string
    pthread_mutex_lock(&mymutex);
    pthread_cond_wait(&mycondition, &mymutex); // prevent real-time rendering to try and use the matrix at the same time as this function
    std::stringstream ss(smatrix);
    while(std::getline(ss, tok, ',')) {
        matrix[i] = ::atof(tok.c_str());
        i++ ;
    }
    i = 0 ;
    pthread_mutex_unlock(&mymutex);
}

按设计工作。 TCP是字节流协议。没有消息边界。如果你想要消息,你必须自己实现它们。