我正在构建Sierra Charts和我的Java程序之间的集成,为了实现这一点,我正在使用他们的DTC协议/框架,这使我能够创建一个Socket Connection(来自我的Java程序),然后来回传递消息。但是,我目前卡住了,因为他们要求我在每条消息之后传递一个空终止符,这不是Java世界中常见的东西而且让我难过。为了让他们的套接字服务器处理我的消息,它需要包含“null终止符”(https://www.sierrachart.com/index.php?page=doc/DTCProtocol.php#JSONEncoding)
我已经联系了Sierra Chart,但他们不是Java商店,也不知道有任何见解。
我已经包含了我的示例类,我正在使用DTC消息的Json编码。我正在做的基础是打开一个Java Socket然后传递一个Json字符串,我将其转换为byte []并通过BufferedOutputStream写入套接字。然后我在等待回应。为了方便我的问题,我将我的JSON作为局部变量引入String。我的问题是我无法破解我正在转换的byte []或String的“null终止符”。我想知道是否有人可以阐明“无效终结者”是什么;我的假设是Sierra Chart Socket Server正在运行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();
}
}
另外我试过这个,(没用):
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);
我确信这是我遗漏的明显事实。但是,我无法进行逻辑跳转,因此我希望有人可以发现我的错误/错误/缺少逻辑。任何帮助将不胜感激。
答案 0 :(得分:0)
我碰巧也在尝试这种方法。
空终止符未解决问题,您已经解决了该问题。
问题是您正在使用BufferedReader。这将无法正常工作,您需要使用BufferedInputStream。
Rgds