我真的很难在谷歌上找到我正在特别寻找的东西,甚至在不知道任何特殊单词的情况下正确解释它,对不起。我正在开发我的第一个 SocketServer,并希望使用 GUI 来扩展它。我想尝试的第一步是为服务器 Activity 创建一个简单的日志窗口。我有一个 JFrame 并且可以向它传递文本。
public class Logger {
private JFrame frame;
private JTextArea tArea;
private JScrollPane jsp;
private StringBuilder sb = new StringBuilder();
File file = new File("C://");
public static void main(String[] args) {
String logTitle = new String(args[0]);
new Logger(logTitle);
}
public Logger(String logTitle) {
init(logTitle);
frame.setVisible(true);
//logToLogger(); // function to append logdata to textarea
}
public void logToLogger(String logText) {
tArea.append(logText.toString());
tArea.setCaretPosition(tArea.getDocument().getLength());
}
private void init(String logTitle) {
frame = new JFrame();
frame.setSize(400, 400);
frame.setTitle(logTitle);
frame.setLocationRelativeTo(null);
tArea = new JTextArea();
jsp = new JScrollPane(tArea);
frame.add(jsp, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我还有一个用于启动服务器的主类。当启动主类时,应该启动一个记录器,然后我将它传递给一个新启动的线程。
我的主类
I WANT TO PASS THE LOGGER TO THE MYTHREAD CLASS ON THE LINE WHERE I WROTE THE INLINE COMMENT
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
public static void main(String[] args) {
Integer port = new Integer(args[0]);
String logTitle = new String(args[1]);
Logger log = new Logger(logTitle);
MyThread t = new MyThread(port, log); // thats the part i cant handle
log.logToLogger("Started on port " + port);
}
}
这是我如何启动一个线程
public class MyThread {
public static void main(int port, Logger log) {
log.logToLogger(port + "logged from MyThread");
}
}
最佳答案
看起来您还没有编写任何从套接字获取数据的内容。您只需要通过 Logger
反对MyThread
构造函数,并调用log.logToLogger(receivedText);
来自MyThread
.
您的代码应如下所示:
public class MyThread implements Runnable {
private Logger log;
private ServerSocket socket;
public MyThread(int port, Logger log) {
this.log = log;
log.logToLogger("SocketServer opened on port "+port);
try {
socket = new ServerSocket(port);
} catch (IOException e) {
log.logToLogger(e.getMessage());
}
}
@Override
public void run() {
while(true) {
Socket server;
try {
server = socket.accept();
log.logToLogger("Connection from"+server.getRemoteSocketAddress());
BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
log.logToLogger("Received:"+reader.readLine());
server.close();
} catch (IOException e) {
log.logToLogger(e.getMessage());
}
}
}
}
public static void main(String[] args) {
Integer port = new Integer(args[0]);
String logTitle = new String(args[1]);
Logger log = new Logger(logTitle);
MyThread t = new MyThread(port, log);
(new Thread(t)).start();
}
套接字代码改编自此处:http://www.bogotobogo.com/Java/tutorial/tcp_socket_server_client.php
在 Windows 上的 cmd 提示符下,运行 telnet 127.0.0.1 1234
并输入您的消息,它应该出现在 JFrame
中假设您在端口 1234 上运行应用程序。
您可能应该扩展 run()
方法比仅仅关闭接收到的线路更强大。
关于java - 将 JFrame 传递给新创建的类以从新类接收日志数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28291257/