我有一个java服务器,它使用tcp和sockets连接到android应用程序(客户端),并发送字符串(当前从scanner对象获取),然后客户端将其显示为通知。
这是没有所有导入的服务器代码。
公共类服务器{
// 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使用的端口号获得通知,甚至只是使用growl作为客户机本身的服务器(客户机代码与服务器非常相似,只是使用socket而不是serversocket)
如果能帮上忙我会非常感激的
一切顺利,
帕特里克。
最佳答案
你有办法做这件事。如果你绝望了,继续读:
Growl可以将收到的任何通知转发到运行Growl的另一台计算机(在“网络”选项卡上配置)。growl使用gntp协议(基于tcp的协议:http://www.growlforwindows.com/gfw/help/gntp.aspx)转发消息。诀窍是“另一台机器运行咆哮”不一定是另一台机器或运行咆哮本身,它只需要看起来咆哮它是。growl(在mac上,这是我假设您正在使用的)将自动检测网络上运行growl的任何其他机器(使用bonjour并查找_gntp.\u tcp服务名称),因此,如果您的服务器宣称自己支持gntp协议,咆哮应该显示在可用目的地列表中。(GrowlforWindows还允许您手动添加主机名/端口以转发到,但我不相信Mac版本当前允许这样做)。
因此,您可以配置growl,使用它已经内置的功能将通知转发到您的服务器。您必须在服务器中实现代码才能接收gntp数据包(格式与http头非常相似)并解析它们。然后可以使用当前服务器代码转发通知。
还和我在一起?我确实说过它是圆的,但这不仅在技术上是可能的,而且我之前已经建立了一个咆哮模拟守护进程,以便我可以从咆哮转发通知到我的自定义代码。不是说这是最好的主意,而是你问起以后的另一个选择。