将操作<String>从 c# 转换为 Java



我目前正在C#(Host(和Java(Client(之间编写一个非常简单的TCP连接

我正在努力用 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("", "");
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 );
}
}

最新更新