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
Sierra Chart DTC Java套接字连接空终止符_Java_Sockets_Byte_Null Terminated - Fatal编程技术网

Sierra Chart DTC Java套接字连接空终止符

Sierra Chart DTC Java套接字连接空终止符,java,sockets,byte,null-terminated,Java,Sockets,Byte,Null Terminated,我正在构建Sierra Charts和我的Java程序之间的集成,为了实现这一点,我使用了他们的DTC协议/框架,该协议/框架使我能够(从我的Java程序)创建套接字连接,然后来回传递消息。然而,我现在被卡住了,因为他们要求我在每条消息之后传递一个空终止符,这在Java世界中并不常见,让我感到困惑。为了让他们的套接字服务器处理我的消息,它需要包含“空终止符”() 我接触过Sierra Chart,但他们不是Java商店,也不知道我有什么见解 我已经包括了我的示例类,我正在使用DTC消息的Json

我正在构建Sierra Charts和我的Java程序之间的集成,为了实现这一点,我使用了他们的DTC协议/框架,该协议/框架使我能够(从我的Java程序)创建套接字连接,然后来回传递消息。然而,我现在被卡住了,因为他们要求我在每条消息之后传递一个空终止符,这在Java世界中并不常见,让我感到困惑。为了让他们的套接字服务器处理我的消息,它需要包含“空终止符”()

我接触过Sierra Chart,但他们不是Java商店,也不知道我有什么见解

我已经包括了我的示例类,我正在使用DTC消息的Json编码。我所做的工作的基础是打开一个Java套接字,然后传递一个Json字符串,该字符串已转换为字节[],并通过BufferedOutputStream写入套接字。然后我在等待答复。为了便于提问,我将JSON作为局部变量放入字符串中。我的问题是我无法破解我正在转换的字节[]或字符串的“空终止符”。我想知道是否有人能解释什么是“空终结者”;我的假设是,Seela图表Socket服务器运行C或C++代码,这是它们的定界符,我似乎无法理解java等价物。
import java.io.*;
import java.net.*;
import java.util.Date;


public class SierraChartSocketClient {

public SierraChartSocketClient() {
String testServerName = "127.0.0.1";
int port = 11099;

try{
      Socket socket = openSocket(testServerName, port);
      socket.setTcpNoDelay(true);

      String result = loginToSocketAndRequestData(socket);

      System.out.println(result);

socket.close();
}catch(Exception e){
e.printStackTrace();
}

}

private String loginToSocketAndRequestData(Socket socket) throws Exception{
byte nullByte = 0x00;
String loginRequestString = "    {\"Type\":1,\"Integer_1\":1,\"HeartbeatIntervalInSeconds\":60\", \"ClientName\": \"Sample Application\"}";

String marketDataRequestCL = "{\"Type\":101,\"RequestAction\":\"SUBSCRIBE\",\"SymbolID\":1,\"Symbol\":\"CLF8\", \"Exchange\":\"NYMEX\"}";
String heartBeat = "{\"Type\":3,\"CurrentDateTime \":\"" + (int) (System.currentTimeMillis() / 1000L) + "\" ";

try{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));


BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
System.out.println("Sending Over Login Request: " + new Date(System.currentTimeMillis()).toString());
bufferedOutputStream.write(loginRequestString.getBytes());
bufferedOutputStream.write(nullByte);
bufferedOutputStream.flush();


StringBuilder stringBuilder = new StringBuilder();
String str = bufferedReader.readLine();
System.out.println(str);
System.out.println("Received Login Response: " + new Date(System.currentTimeMillis()).toString());

bufferedOutputStream.write(heartBeat.getBytes());
bufferedOutputStream.flush();
System.out.println("Sending Heartbeat: " + new Date(System.currentTimeMillis()).toString());

bufferedOutputStream.write(marketDataRequestCL.getBytes("ISO-8859-1"));
bufferedOutputStream.write(nullByte);

while((str = bufferedReader.readLine()) != null){
stringBuilder.append(str + "\n");
System.out.println(str);
}


return null;
}catch (IOException e){
e.printStackTrace();
throw e;
}
}

private Socket openSocket(String server, int port) throws Exception{
Socket socket;

try{
InetAddress inteAddress = InetAddress.getByName(server);
SocketAddress socketAddress = new InetSocketAddress(inteAddress, port);

socket = new Socket();

int timeoutInMs = 45*1000; // 45 seconds
socket.connect(socketAddress, timeoutInMs);

return socket;

}catch (SocketTimeoutException e){
System.err.println("Timed out waiting for the socket.");
e.printStackTrace();
throw e;

}
}

public static void main(String[] args){
new SierraChartSocketClient();
}

}
此外,我也尝试过这个(不起作用):

然后我试过这个(没用):


我确信这是我明显缺少的东西。然而,我还没能进行逻辑跳跃,所以我希望有人能发现我的错误/错误/遗漏的逻辑。任何帮助都将不胜感激。

我碰巧也在尝试这个

空终止符没有给出问题,你已经解决了

问题是您正在使用BufferedReader。这不起作用,您需要使用BufferedInputStream

Rgds

String loginRequestString = "{\"Type\":1,\"Integer_1\":1,\"HeartbeatIntervalInSeconds\":60\", \"ClientName\": \"Sample Application\"}";
byte[] loginRequestBytes = new byte[(loginRequestString.getBytes().length) + 1];
ByteBuffer bbuf = ByteBuffer.wrap(loginRequestBytes);
bbuf.put(loginRequestString.getBytes());
int len = loginRequestString.length();
byte b[] = new byte[len + 1];
ByteBuffer bbufj = ByteBuffer.wrap(b);
enc.encode(CharBuffer.wrap(loginRequestString), bbufj, true);