Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数据写入BlackBerry中的套接字?_Blackberry_Sockets - Fatal编程技术网

如何将数据写入BlackBerry中的套接字?

如何将数据写入BlackBerry中的套接字?,blackberry,sockets,Blackberry,Sockets,我向服务器发送了两次数据。首先,我发送“Hello world”,然后发送“Server”。 但是服务器在读取1次时收到了数据。但是服务器必须在两次读取操作中读取数据 另外,我写数据。然后从服务器读取数据,然后我写入数据。 在这种情况下,服务器可以读取第一个数据。但服务器无法读取第二个数据。 服务器使用读、写、读 那么如何克服这个问题呢?如何将数据写入BlackBerry中的套接字?对于第一个查询,我猜您使用的是TCP。如果您使用UDP,那么服务器将按照您想要的顺序读取数据包 关于第二个查询,你

我向服务器发送了两次数据。首先,我发送“Hello world”,然后发送“Server”。 但是服务器在读取1次时收到了数据。但是服务器必须在两次读取操作中读取数据

另外,我写数据。然后从服务器读取数据,然后我写入数据。 在这种情况下,服务器可以读取第一个数据。但服务器无法读取第二个数据。 服务器使用读、写、读


那么如何克服这个问题呢?如何将数据写入BlackBerry中的套接字?

对于第一个查询,我猜您使用的是TCP。如果您使用UDP,那么服务器将按照您想要的顺序读取数据包


关于第二个查询,你能更清楚/详细地解释一下吗?

对于第一个查询,我想你使用的是TCP。如果您使用UDP,那么服务器将按照您想要的顺序读取数据包


关于第二个查询,你能更清楚/详细一些吗?

如果没有更多细节,很难说,但听起来你在第一种情况下使用的是单向通信,即客户先写,然后再写。服务器将2次写入作为1次读取接收的原因有很多。在客户端缓冲,在无线堆栈(或BES)的某个位置,在服务器端缓冲。所有这些都是合法的TCP/IP协议


在不了解解决方案的情况下,您是否考虑过定义一个小协议,即客户端在发送第二次写入之前写入一个或多个已知字节(如0字节?)?然后服务器可以读取,然后识别定界字节,并说‘啊哈,这现在是与客户端不同的写入’?

如果没有更多细节,很难说,但听起来像是在第一种情况下使用单向通信——即客户端写入,然后再次写入。服务器将2次写入作为1次读取接收的原因有很多。在客户端缓冲,在无线堆栈(或BES)的某个位置,在服务器端缓冲。所有这些都是合法的TCP/IP协议


在不了解解决方案的情况下,您是否考虑过定义一个小协议,即客户端在发送第二次写入之前写入一个或多个已知字节(如0字节?)?然后服务器可以读取,然后识别定界字节,并说“啊哈,这现在是与客户端不同的写入”?

您描述的是默认情况下TCP的工作方式。您看到的是Nagle算法(RFC896)正在发挥作用,它减少了发送的出站数据包的数量,以便尽可能高效地处理这些数据包。您可能在代码中发送2个数据包,但它们作为1个数据包一起传输。因为TCP是一个字节流,所以接收方不应该对它得到的数据包数量做任何假设。您必须在更高级别的协议中定义数据包数据,并且接收方必须根据该协议处理数据。它必须处理多个数据包在一次读取中到达的情况,一个数据包在多次读取中到达的情况,以及介于两者之间的所有情况,仅在完全接收数据包数据时处理数据包数据,在需要时,缓存为后续读取而保留的内容。

您描述的是TCP默认工作方式。您看到的是Nagle算法(RFC896)正在发挥作用,它减少了发送的出站数据包的数量,以便尽可能高效地处理这些数据包。您可能在代码中发送2个数据包,但它们作为1个数据包一起传输。因为TCP是一个字节流,所以接收方不应该对它得到的数据包数量做任何假设。您必须在更高级别的协议中定义数据包数据,并且接收方必须根据该协议处理数据。它必须处理多个数据包在一次读取中到达的情况,一个数据包在多次读取中到达的情况,以及介于两者之间的所有情况,仅在完全接收数据包数据时处理数据包数据,缓存剩余的内容,以便在需要时进行后续读取。

我会尝试显式告诉Connector.open以读写方式打开流。然后,我会确保在每次与服务器通话后刷新连接

SocketConnection connection = (SocketConnection) Connector.open(url, Connector.READ_WRITE);
OutputStream out = connection.openOutputStream();
// ... write to server
out.flush()

我会尝试显式地告诉Connector.open以读写方式打开流。然后,我会确保在每次与服务器通话后刷新连接

SocketConnection connection = (SocketConnection) Connector.open(url, Connector.READ_WRITE);
OutputStream out = connection.openOutputStream();
// ... write to server
out.flush()

如前所述,这是一种预期的TCP行为,可以节省带宽。请注意,交付包时会添加大量数据(例如,目标端口、序列号、校验和…)

我建议您在协议中做更多的工作,而不是刷新数据。例如,您可以定义一个标头,其中包含要读取的字节数,然后是有效负载(实际数据)

下面的代码是一个协议,用结构为[length]的字符串编码;[数据]

StringBuffer headerStr = new StringBuffer();
StringBuffer data = new StringBuffer();
//read header
char headerByte = dataInputStream.readChar();
while (headerByte != ';') {
  headerStr.append(headerByte);
  headerByte = dataInputStream.readChar();
}
//header has the number of character to read
int header= Integer.parseInt(headerStr.toString());
int bytesReaded = 1;
char dataByte = dataInputStream.readChar();
//we should read the number of characters indicated in the header
while (bytesReaded < header) {
 data.append(dataByte);
 dataByte = dataInputStream.readChar();
 bytesReaded++;
}
StringBuffer headerStr=newstringbuffer();
StringBuffer数据=新的StringBuffer();
//读标题
char headerByte=dataInputStream.readChar();
while(headerByte!=';'){
headerStr.append(headerByte);
headerByte=dataInputStream.readChar();
}
//标头具有要读取的字符数
int header=Integer.parseInt(headerStr.toString());
int字节读取=1;
char dataByte=dataInputStream.readChar();
//我们应该读取标题中指示的字符数
while(字节读取<页眉){
data.append(数据字节);
dataByte=dataInputStream.readChar();
ByteReaded++;
}

如前所述,这是一种预期的TCP行为,可以节省带宽。请注意,交付包时会添加大量数据(例如,目标端口、序列号、校验和…)

我建议您在协议中做更多的工作,而不是刷新数据。例如,您可以定义一个标头,其中包含要读取的字节数,然后是有效负载(实际数据)

以下代码是用字符串编码的协议