在 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是字节流协议。没有消息边界。如果你想要消息,你必须自己实现它们。
我目前正在开发平板电脑(客户端)和 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是字节流协议。没有消息边界。如果你想要消息,你必须自己实现它们。