为了账号安全,请及时绑定邮箱和手机立即绑定

将 Action<String> 从 c# 转换为 Java

将 Action<String> 从 c# 转换为 Java

C#
隔江千里 2021-11-21 15:18:59
我目前正在 C#(主机)和 Java(客户端)之间编写一个非常简单的 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("\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)        {...}    }
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您可以使用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 );

    }

}


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信