2

我已经使用 Sockets 和 Swing 在 Java 中创建了简单的即时消息应用程序。现在它通过解析作为参数传递的主机名(PC 名称)或 IP 进行通信。但是有没有办法让它以 Windows 用户 ID(即您登录 Windows 时使用的用户 ID)作为参数发送消息?这似乎在 C# 中很容易完成,但是如何在 Java 中完成呢?

4

2 回答 2

1

可以使用 System.getProperty 获取用户名:

String name = System.getProperty("user.name");

于 2011-08-09T13:42:34.143 回答
0

这似乎很容易在 C# 中完成

第 3 方应用程序(Winsent 的 Sent 实用程序 - winsentmessenger.com/sent)显然可以做到这一点。

http://www.winsentmessenger.com/netsend/

有问题的应用程序只是网络发送的包装器。

您也可以这样做,并直接调用该过程。

一个解决方案来自: http: //members.iinet.net.au/~alw1746/awhome/freeware/WinPopup_java.txt

/*
 WinPopup: send message to PC(s) on a Windows network from a Java program (like winpopup or net send).
 Usage:
   java WinPopup "user1,user2,..." "message"
   eg. java WinPopup "peter" "where are you?" or java WinPopup 192.168.14.20 "Hello"
 Build:
   javac WinPopup.java

 Alex Wong, Feb 2001
*/
import java.util.*;
import java.text.*;
import java.io.*;

public class WinPopup {

  public static void main(String args[]) throws Exception {
    String status;

    if (args.length < 2) {
      System.out.println("Usage: java WinPopup \"user1,user2,...\" \"msg\"");
      System.exit(1);
    }
    if (args[0].length() < 1) {
      System.out.println("User not found");
      System.exit(1);
    }
    if (args[1].length() < 1) {
      System.out.println("Message not found");
      System.exit(1);
    }
    WinPopup popup=new WinPopup();
    status=popup.alert(args[0],args[1]);
    if (!status.equals("OK"))
      System.out.println(status);
  }
  
  public String alert(String users,String msg) {
  //loop thru list of users and net send the msg.
    String buf,userList,user;
    StringBuffer popup;
    int ulen;

    try {
      if (users.length() < 1)
        throw new Exception("User list not found.");
      if (msg.length() < 1)
        throw new Exception("Message not found.");

      popup=new StringBuffer();
      StringTokenizer st=new StringTokenizer(users,",");
      while (st.hasMoreTokens()) {
        buf=st.nextToken();
        popup.append(buf).append(",");
      }
      if (popup.length() > 0) {
        popup=popup.deleteCharAt(popup.length()-1);
        userList=popup.toString();
        ulen=userList.length();
        for (int start=0,fin=0; fin <= ulen; fin++) {
          if ((fin==ulen && fin > start) || userList.charAt(fin)==',') {
            user=userList.substring(start,fin);
            dosCmd("net send "+user+" \""+msg+"\"");
            fin++;
            start=fin;
          }
        }
      }
      return "OK";
    }
    catch (Exception e) {
      return e.toString();
    }
  }

  public void dosCmd(String cmd) {
  //spawns a DOS process to run the net send command.
    java.lang.Runtime rt;
    Process proc;

    try {
      rt=java.lang.Runtime.getRuntime();
      proc=rt.exec("c:\\winnt\\system32\\cmd.exe /C "+cmd);

      StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
      StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
      errorGobbler.start();
      outputGobbler.start();
      int exitVal=proc.waitFor();
    }
    catch (Exception e1) {
      System.out.println("dosCmd exception.");
      System.out.println(e1.toString());
    }
  }
  
  class StreamGobbler extends Thread {
  //eat all stderr and stdout output.
    InputStream is;
    String type;
    
    StreamGobbler(InputStream is, String type) {
      this.is = is;
      this.type = type;
    }
    
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
              ;
         } catch (IOException ioe) {
            ioe.printStackTrace();
         }
    }
  }
}
于 2011-08-09T14:40:49.447 回答