Java带外(称为“紧急数据”)数据

Java带外(称为“紧急数据”)数据,java,c,sockets,out-of-band,Java,C,Sockets,Out Of Band,下面是一些试图使用OOB(紧急)数据的基本代码。我的问题是,如果客户端使用C或Java,服务器部分的行为就不一样了。 请注意,您可能认为两个客户端都有一些棘手的问题,但如果我使用C服务器(以更好地控制OOB),那么无论我的服务器端OOB控制是什么,两个客户端的行为都完全相同 首先是服务器(Java)部分: 这就是我得到的(首先是C客户机,然后是Java客户机): Java服务器似乎无法看到从C客户端发送的OOB数据。为什么0似乎丢失了?它没有,因为服务器至少检测到流中的oob边界 好的,这似乎与

下面是一些试图使用OOB(紧急)数据的基本代码。我的问题是,如果客户端使用C或Java,服务器部分的行为就不一样了。 请注意,您可能认为两个客户端都有一些棘手的问题,但如果我使用C服务器(以更好地控制OOB),那么无论我的服务器端OOB控制是什么,两个客户端的行为都完全相同

首先是服务器(Java)部分:

这就是我得到的(首先是C客户机,然后是Java客户机):


Java服务器似乎无法看到从C客户端发送的OOB数据。为什么
0
似乎丢失了?它没有,因为服务器至少检测到流中的oob边界

好的,这似乎与JVM实现有关。 我在不同的操作系统和JVM上进行了不同的测试

在使用JDK1.6的不同Linux上,一切都是正确的(Java 7未经测试)

但我的Mountain Lion有问题,它的行为因Java版本而异。
似乎是与苹果的实现有关的JVM错误。

带外数据在所有套接字实现上的支持方式不同。就这么简单

微软的建议如下:

目前,对RFC 793有两种相互矛盾的解释(引入该概念的地方)

伯克利软件发行版(BSD)中OOB数据的实现不符合RFC 1122中规定的主机要求

具体来说,BSD中的TCP紧急指针指向紧急数据字节后的字节,而符合RFC的TCP紧急指针指向紧急数据字节。因此,如果应用程序将紧急数据从BSD兼容的实现发送到与RFC 1122兼容的实现,则接收器读取错误的紧急数据字节(它将位于数据流中正确字节之后的字节读取为紧急数据字节)

为了尽量减少互操作性问题,建议应用程序编写者不要使用OOB数据,除非与现有服务互操作需要使用OOB数据。敦促Windows Socket供应商记录其产品实现的OOB语义(BSD或RFC 1122)

如果您正在编写一个新协议,并且需要带外数据,我建议您需要为紧急数据建立一个单独的连接,或者需要在应用层对其进行多路传输


因此,如果你有选择的话,我的建议是不要使用OOB数据。

:“在计算机网络中,带外数据(在TCP中称为“紧急数据”)在应用程序看来就像是主数据流中的一个独立数据流。”-亲爱的下游投票者,这不是一个紧急问题,而是关于紧急数据。这并不能回答我的问题。首先,您可能会注意到我设置了OOBInline标志,其次,它可以与一个客户机协同工作,但不能与另一个客户机协同工作。只是很多人对你的问题投了否决票,因为他们在标题中读到了“紧急”…我很少抛出+1来否定虚假的否决票,但这实际上是一个构造良好的问题。我希望你能得到答案。关于你的C代码:
I
的价值是什么?如果未初始化,那么服务器可能会收到一些不可见的字符。为什么会被否决?这似乎是一个很好的观点,并且与OP的答案一致,即代码在不同的平台/JVM版本上表现不同。根据我的答案,Apple Mac OS基于BSD Unix。
Socket s = ss.accept();
s.shutdownOutput();
s.setOOBInline(true);
InputStream is = s.getInputStream();
for (;;) {
  byte []d = new byte[3];
  int l = is.read(d);
  if (l==-1) break;
  for (int i=0; i<l; i++) System.out.print((char)d[i]);
  System.out.println();
  Thread.sleep(2000);
}
Socket s = new Socket("localhost",61234);
s.shutdownInput();
OutputStream os = s.getOutputStream();
byte []n = new byte[10];
for (int i=0; i<n.length; i++) n[i] = (byte)('A'+i);
byte m = (byte)('0');   
os.write(n);
System.out.println("normal sent");
s.sendUrgentData(m);
System.out.println("OOB sent");
os.write('Z');
System.out.println("normal sent");
s = socket(PF_INET,SOCK_STREAM,0);
bzero(&a,sizeof(a));
a.sin_family = AF_INET;
a.sin_port = htons(61234);
a.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(s,(struct sockaddr *)&a,sizeof(a));
shutdown(s,SHUT_RD);
char m = '0';
char *n = "ABCDEFGHIJ";

printf("normal sent %d\n",write(s,n,strlen(n)));
printf("OOB sent %d\n",send(s,&m,1,MSG_OOB));
printf("normal sent %d\n",write(s,"Z",1));
Accepting connection
ABC
DEF
GHI
J
Z
Accepting connection
ABC
DEF
GHI
J
0Z