DatagramSocket UDP 서버/클라이언트 채팅 응용 프로그램을 만들려고했지만 DatagramPacket으로 패킷을받은 후 GUI를 업데이트하는 데 문제가 있습니다. 여기 내 코드가있다. 내 생각에 부적절하다고 생각한 유일한 예외는 내 JFrame 윈도우에 대한 그루 빙 코드였습니다.DatagramSocket UDP 서버 스윙 InvokeLater가 작동하지 않음
public class Server extends JFrame {
JButton startServerButton;
JTextField textField;
JTextArea textArea;
public Server() {
super("Server");
initComponents();
setResizable(false);
setVisible(true);
}
private void startServer() throws IOException {
DatagramSocket serverSocket;
String sentence;
startServerButton.setText("Server started");
startServerButton.setEnabled(false);
while (true) {
serverSocket = new DatagramSocket(9876);
// receive
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
sentence = new String(receivePacket.getData());
int port = receivePacket.getPort();
System.out.println("RECEIVED (port " + port + "): " + sentence);
showMessage("RECEIVED (port " + port + "): " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
// send
byte[] sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
serverSocket.close();
}
}
private void showMessage(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.append("\n" + text);
}
});
}
private void initComponents() {
startServerButton = new JButton();
textField = new JTextField();
textArea = new JTextArea();
textArea.setEditable(false);
startServerButton.setText("Start server");
startServerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
startServer();
} catch (IOException e) {
e.printStackTrace();
}
}
});
...grouplayout stuff here...
}
public static void main(String args[]) {
Server server = new Server();
}
}
그래서 문제는 내 JFrame의에 텍스트 영역이 업데이트되지 없구요,하지만 내 System.out.println()
항상 인쇄가 제대로 메시지가 내 클라이언트 클래스에서 받았다. 내 Client 클래스의 코드를 보여줄 수는 있지만 관련이 없다고 느꼈습니다. 고마워. 고마워.
왜 작성 및 루프 주위 소켓마다 시간을 닫는? 그렇게 메시지를 놓칠 수 있습니다. – EJP