私はJavaとTCP全般に不慣れです。
次のシナリオでは、tcp サーバーに要求を送信し、直接応答を受信すると、サーバーは未承諾のイベント メッセージを後で送信します。
次のクライアントを実装しました
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TcpClient {
private InetAddress connectedAddress;
private Socket tcpSocket;
private int connectedPort;
private OutputStream outStream;
private boolean first = true;
private static final Log log = LogFactory.getLog(TcpClient.class);
public TcpClient(String host, int port) {
try {
this.connectedAddress = Inet4Address.getByName(host);
this.connectedPort = port;
this.tcpSocket = new Socket(connectedAddress, connectedPort);
this.outStream = this.tcpSocket.getOutputStream();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessage(String message) throws IOException {
log.debug("Sending Message \n" + message);
synchronized (this) {
if (!this.tcpSocket.isConnected())
return;
DataOutputStream dos = new DataOutputStream(outStream);
dos.write(message.getBytes());
dos.flush();
if(first){
first = false;
(new Thread(new TcpListeningThread())).start();
}
}
}
private class TcpListeningThread implements Runnable {
public TcpListeningThread() {
// Nothing to do...
}
@Override
public void run() {
try {
while (true) {
DataInputStream dis = new DataInputStream(tcpSocket.getInputStream());
int len = dis.readInt();
byte[] data = new byte[len];
dis.read(data);
String response = new String(data, "US-ASCII");
if (null != response && !StringUtils.isBlank(response)) {
log.debug("Received Response [" + response + "]");
processXmlResponse(response);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
このコードは、if(first) 条件を削除し、リクエストが送信されるたびに読み取りスレッドを呼び出し、while true を削除しながら、送信された最初のリクエストに対する最初の応答のみを読み取るようです。コードは応答を読み取ることができるようです送信されたすべてのリクエストに対して、もちろんイベント メッセージを読み取ることはできません。
助けていただければ幸いです。
ありがとう :)