3

我有一个 java 服务器,它使用 TCP 和套接字连接到 Android 应用程序(客户端)并发送字符串(当前从扫描仪对象获取),然后客户端将其显示为通知。

这是没有所有导入的服务器代码。

公共类服务器{

// define our Main method
public static void main(String[] args) throws IOException {
    // set up our Server Socket, set to null for the moment.
    ServerSocket serverSocket = null;
             boolean isConnected = false;

    // Lets try and instantiate our server and define a port number .
    try {
        serverSocket = new ServerSocket(6789);
                isConnected = true;
        System.out.println("***  I am the Server  ***\n");
        // make sure to always catch any exceptions that may occur.
    } catch (IOException e) {
        // always print error to "System.err"
        System.err.println("Could not listen on port: 6789.");
        System.exit(1);
    }

    // We always want to check for connection from Clients, so lets define
    // a for ever loop.
    for (;;) {
        // define a local client socket
        Socket clientSocket = null;
        // lets see if there are any connections and if so, accept it.
        try {
            clientSocket = serverSocket.accept();
            // don't forget to catch your exceptions
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        // Prepare the input & output streams via the client socket.

        // fancy way of saying we want to be able to read and write data to 
        // the client socket that is connected.

        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));
        PrintWriter outToClient = new PrintWriter(clientSocket.getOutputStream(),
                true);

              while (isConnected) { 
        // read a sentence from client
        String hiFromClient = inFromClient.readLine();


                    // Set up the logging system and timestamp and log message.

                     Calendar currentDate = Calendar.getInstance();
         SimpleDateFormat formatter= 
         new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss");
         String dateNow = formatter.format(currentDate.getTime());


        try{
            // Create file 
            File fstream = new File("log.txt");
                        FileWriter out = new FileWriter(fstream);
                               out.write(hiFromClient + " " + dateNow);

                               //Close the output stream
                               out.close();
                    } catch (Exception e){//Catch exception if any
                           System.err.println("Error: " + e.getMessage());
                    }


        // Print the client sentence to the screen
        System.out.println("The Client said: "+hiFromClient);

        // Reply to the client

                    Scanner scanner = new Scanner(System.in);
                    String sentence = scanner.nextLine();

        outToClient.println(sentence );
                    System.out.println("The Server said: " + sentence);

        }     
        // always remember to close all connections.


        inFromClient.close(); // the reader
        outToClient.close(); // the writer
        clientSocket.close(); // and the client socket
    }
}}

Growl 使用端口 23053 进行通知转发。我希望做的是监听 23053 并将其中的任何内容作为字符串发送到连接在 6789 的客户端。可悲的是,Growl 绑定了端口号,因此无法建立新的 Socket 连接。

任何人对我如何从端口号咆哮使用的通知,甚至只是使用咆哮作为客户端本身的服务器有任何想法(客户端的代码与服务器非常相似,只是使用 Socket 而不是 ServerSocket)

对此的任何帮助将不胜感激,它破坏了我的大脑

祝一切顺利,

帕特里克。

4

1 回答 1

1

有一种迂回的方法可以做到这一点。如果您感到绝望,请继续阅读:

Growl 可以将它收到的任何通知转发到另一台运行 Growl 的机器(在“网络”选项卡上配置)。Growl 使用 GNTP 协议(​​基于 TCP 的协议:http ://www.growlforwindows.com/gfw/help/gntp.aspx) 转发消息。诀窍在于,“运行 Growl 的其他机器”不必真的是另一台机器或运行 Growl 本身,它只需要让 Growl 看起来就是这样。Growl(在 Mac 上,我假设您正在使用)将自动检测网络上运行 Growl 的任何其他机器(使用 Bonjour 并查找 _gntp._tcp 服务名称),因此如果您的服务器宣传自己支持 GNTP协议,Growl 应该在可用目的地列表中显示它。(Windows 的 Growl 还允许您手动添加要转发到的主机名/端口,但我不相信 Mac 版本目前允许这样做)。

因此,您可以将 Growl 配置为使用其已经内置的功能将通知转发到您的服务器。您必须在服务器中实现代码以接收 GNTP 数据包(格式与 HTTP 标头非常相似)并解析它们。然后您可以使用您当前的服务器代码转发通知。

还在我这儿?我确实说过这是迂回的,但这不仅在技术上是可行的,而且我之前已经构建了一个 Growl 模拟守护进程,以便我可以将通知从 Growl 转发到我的自定义代码。不是建议它是最好的主意,而是你问的一个替代方案。

于 2012-04-05T21:56:01.573 回答