Java 使用带套接字的Sesame或ApacheJena发送RDF/XML

Java 使用带套接字的Sesame或ApacheJena发送RDF/XML,java,sockets,rdf,jena,sesame,Java,Sockets,Rdf,Jena,Sesame,我正在尝试使用Java中的套接字将RDF/XML从客户机发送到服务器。当我发送信息时,服务器程序会挂起,并且不会收到信息,除非我关闭客户端的套接字或OutputStream。即使我在客户端刷新OutputStream,服务器也不会接收数据,除非我关闭套接字/流。我想在不关闭插座的情况下发送信息。下面是客户端的一些示例代码(使用Sesame): 和服务器处理程序: import java.io.*; import java.net.*; import org.openrdf.rio.*; impo

我正在尝试使用Java中的套接字将RDF/XML从客户机发送到服务器。当我发送信息时,服务器程序会挂起,并且不会收到信息,除非我关闭客户端的套接字或OutputStream。即使我在客户端刷新OutputStream,服务器也不会接收数据,除非我关闭套接字/流。我想在不关闭插座的情况下发送信息。下面是客户端的一些示例代码(使用Sesame):

和服务器处理程序:

import java.io.*;
import java.net.*;
import org.openrdf.rio.*;
import org.openrdf.rio.helpers.*;
import org.openrdf.model.*;
import org.openrdf.model.impl.*;

public class SimpleRDFSHandler implements Handler {
    public void handleConnection(Socket socket) {
        Model model = null;
        try {
            InputStream in = socket.getInputStream();

            model = Rio.parse(in,"www.blah.com",RDFFormat.RDFXML);

            for (Statement st: model) {
                System.out.println(st);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

问题似乎来自Rio.parse()方法挂起(我认为是因为它不知道输入何时结束)。当我以类似的方式使用Jena api时,我会遇到类似的问题,即使用Model.write(outputstream,format)和Model.read(inputstream,format)而不是Rio。我已经研究源代码和javadoc很多年了,但无法解决这个问题。我想这一定是我误解了一些简单的事情。有什么想法吗?

我不认为这是Jena/Sesame特有的问题,而是围绕套接字使用的Java问题。您不想关闭插座的实际原因是什么

我不明白为什么这样做是明智的,除非您希望在服务器端接收数据时不断发布数据并对其进行处理?如果是这种情况,Jena和Sesame都有API,专门允许您在解析数据时控制数据发生的情况,这样您就不会依赖于在处理数据之前完成读取调用

还有,为什么要使用套接字呢?Sesame和Jena都有全面的HTTP集成,这比使用和部署自己的基于套接字的服务器和客户端要容易得多

丑陋的黑客解决方案 如果你真的必须这样做,那么有一个解决办法,但它有点可怕和脆弱,我强烈建议你不要这样做

在客户端,在写入数据后,写入一个字节序列,指示流的结束。在服务器端,使用自定义InputStream实现包装套接字流,该实现识别该序列,并在看到该序列时停止返回数据。这应该允许Jena/Sesame代码正确运行,该代码期望流完成

需要仔细选择字节序列,以便它不会自然出现在数据中


老实说,这是一个糟糕的想法,如果你的目标是持续发布数据,这并不能真正解决你的问题,因为你只会在服务器端泄漏套接字,除非你将服务器端套接字处理代码放入
while(true)
循环,这可能是另一个坏主意。

你是对的,我想持续发布数据,并在服务器端接收数据时对其进行处理。不使用HTTP集成的原因(可能不正确)是因为我有一个规则引擎,需要对传入的数据做出反应;对服务器端存储库的任何请求都是由规则引擎而不是客户端发出的。所以我认为套接字应该是一种方式。当您提到Jena和Sesame API时,它们允许您“在解析数据时控制数据发生的情况,这样您就不会依赖于在处理数据之前完成的读取调用”,您想到了API的哪些特定部分?我知道这可以解决问题,但我需要一个API调用指针。无法从文档中准确理解您的意思。有关详细信息,请参阅
import java.io.*;
import java.net.*;
import org.openrdf.rio.*;
import org.openrdf.rio.helpers.*;
import org.openrdf.model.*;
import org.openrdf.model.impl.*;

public class SimpleRDFSHandler implements Handler {
    public void handleConnection(Socket socket) {
        Model model = null;
        try {
            InputStream in = socket.getInputStream();

            model = Rio.parse(in,"www.blah.com",RDFFormat.RDFXML);

            for (Statement st: model) {
                System.out.println(st);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}