В настоящее время я пишу действительно простое TCP-соединение между C# (Host) и Java (Client)
Я борюсь с получением сообщений в java, я нашел (на мой взгляд) хорошее решение для C#. Я передаю ссылку на метод в конструкторе, который будет сохранен, позже, если будет получено сообщение, я могу просто вызвать этот метод из родительского класса.
Я хочу сделать то же самое в java, но понятия не имею, как это сделать!
В конце концов, я хочу иметь простой в использовании класс, как мне перезвонить в java.
Код сервера (C#)
class Server
{
private TcpListener serverSocket;
private TcpClient clientSocket;
private NetworkStream networkStream;
private Action<string> outRecievedMethod;
private Thread recievingRoutineThread;
public Server(int port, Action<string> outRecievedMethod) {
serverSocket = new TcpListener(IPAddress.Any,port);
clientSocket = default(TcpClient);
serverSocket.Start();
clientSocket = serverSocket.AcceptTcpClient();
networkStream = clientSocket.GetStream();
this.outRecievedMethod = outRecievedMethod;
recievingRoutineThread = new Thread(this.recievingRoutine);
recievingRoutineThread.Start();
}
private void recievingRoutine()
{
while (true)
{
String recievingString = null;
try
{
recievingString = recieve();
}catch (Exception ex) { }
recievingString = recievingString.Replace("\0", "");
if (recievingString != null && recievingString != "")
outRecievedMethod((String)recievingString.Clone());
}
}
private string recieve()
{
byte[] bytesFrom = new byte[65536];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
return dataFromClient;
}
public void send(string msg)
{...}
public void send(byte[] msgBytes)
{...}
}
Клиентский код (Java)
private final String host;
private Socket clientSocket;
private OutputStream socketOutStream;
private OutputStreamWriter osr;
private BufferedWriter bw;
private InputStream socketinstr;
private InputStreamReader isr;
private BufferedReader br;
public Client(String ip, int port) throws IOException {
host = ip;
clientSocket = new Socket(ip,port);
//init output
socketOutStream = clientSocket.getOutputStream();
osr = new OutputStreamWriter(socketOutStream);
bw = new BufferedWriter(osr);
//init Input
socketinstr = clientSocket.getInputStream();
isr = new InputStreamReader(socketinstr);
br = new BufferedReader(isr);
System.out.println("Connected to " + host + ":" + String.valueOf(port));
Thread recievingRoutineThread = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
String recievingString = null;
try{ recievingString = recieve();
}catch(Exception ex) {}
if (recievingString != null && recievingString != "")
sendRecievedMessageOutside(recievingString);
}
}
});
recievingRoutineThread.start();
}
private void sendRecievedMessageOutside(String message){
//here i want to callback a method passed in the construcktor
//just like in c#
}
String recieve() throws IOException {
char[] buff = new char[65536];
while (br.ready()) {
br.read(buff);
}
return new String(buff);
}
public boolean send(String msg) {...}




Вы можете использовать java.util.function.Consumer. Передайте экземпляр потребителя конструктору клиента и вызовите метод accept потребителя при получении:
public class Client {
private final Consumer<String> messageConsumer;
public Client( String ip, int port, Consumer<String> messageConsumer) throws IOException {
this.messageConsumer = messageConsumer;
Thread recievingRoutineThread = new Thread( new Runnable() {
@Override
public void run() {
while(true) {
String recievingString = null;
try{ recievingString = recieve();
}catch(Exception ex) {}
if (recievingString != null && recievingString != "")
sendRecievedMessageOutside(recievingString);
}
}
} );
recievingRoutineThread.start();
}
private void sendRecievedMessageOutside(String message){
messageConsumer.accept( message );
}
}
спасибо, это именно то, что я искал, самый простой обратный вызов :)