2014-07-14 2 views
-4

자바에서 GUI로 간단한 채팅 서버를 만들었고 클라이언트를 만들기 전에 테스트했습니다. telnet localhost 8888. cmd에 아무 것도 입력하자마자 연결이 끝납니다. 다음은 서버 코드입니다. package chat.application; 여기간단한 자바 채팅 서버?

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class ChatServer extends JFrame{ 

private JTextField userText; 
private final JTextArea chatWindow; 
private ObjectOutputStream output; 
private ObjectInputStream input; 
private ServerSocket server; 
private Socket connection; 

public ChatServer(){ 
    super("Chat messenger"); 
    userText = new JTextField(); 
    userText.setEditable(false); 
    userText.addActionListener(
     new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent event){ 
       sendMessage(event.getActionCommand()); 
       userText.setText(""); 
      } 
     } 
    ); 
    add(userText, BorderLayout.NORTH); 
    chatWindow = new JTextArea(); 
    add(new JScrollPane(chatWindow)); 
    setSize(300,150); 
    setVisible(true); 

} 
// setting up server 
public void startRunning(){ 
    try{ 
     server = new ServerSocket(8888, 32); 
     // if 8888 doesn't work try 6789 
     // 32 is backlog- how people can speak 
     while(true){ 
      // run forever 
      try{ 
       waitForConnection(); 
       setupStreams(); 
       whileChatting(); 
      }catch(EOFException eofException){ 
       showMessage("\n Server ended the connection"); 
      }finally{ 
       closeSocket(); 
      } 
     } 
    }catch(IOException ioException){ 
     System.out.println("Error, Oh no!"); 
    } 
} 
private void waitForConnection() throws IOException{ 
    showMessage("Waiting for a connection...\n"); 
    connection = server.accept(); 
    showMessage("Connected to " 
      + connection.getInetAddress().getHostName()+ " so you can start talking now!"); 


} 
private void setupStreams() throws IOException{ 
    output = new ObjectOutputStream(connection.getOutputStream()); 
    output.flush(); 
    input = new ObjectInputStream(connection.getInputStream()); 
    showMessage("\n Streams are set up. \n"); 

} 
private void whileChatting() throws IOException{ 
    String message = "Connected "; 
    sendMessage(message); 
    ableToType(true); 
    do{ 
     try{ 
      message = (String) input.readObject(); 
      showMessage("\n" + message); 
     }catch(ClassNotFoundException classNotFoundException){ 
      showMessage("\n error"); 

     } 
    }while(!message.equals("CLIENT - END")); 
    // if user types end program terminates 
} 
private void closeSocket(){ 
    // close streams, sockets when done. 
    showMessage("\n Closing connections... \n"); 
    ableToType(false); 
    try{ 
     output.close(); 
     input.close(); 
     connection.close(); 
    }catch(IOException ioException){ 
     System.out.println("Error"); 
    } 
} 
private void sendMessage(String message){ 
    // sends message to client 
    try{ 
     output.writeObject("SERVER - " + message); 
     output.flush(); 
     showMessage("\n SERVER - " + message); 
    }catch(IOException ioException){ 
     chatWindow.append("\n ERROR: dont do that okay! \n"); 


    } 
} 
private void showMessage(final String text){ 
    // updates chat window 
    SwingUtilities.invokeLater(
      new Runnable(){ 
       @Override 
       public void run(){ 
        chatWindow.append(text); 

       } 
      } 
    ); 
} 
private void ableToType(final boolean tr_or_flse){ 
    SwingUtilities.invokeLater(
      new Runnable(){ 
       @Override 
       public void run(){ 

       } 


      } 
    );  
}    

}

와 메인 메소드를 사용하여 클래스 : 그건 전혀 영향을 미치는 경우

package chat.application; 
import javax.swing.JFrame; 

public class ServerTest { 
public static void main(String[] args){ 
    ChatServer the_server = new ChatServer(); 
    the_server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    the_server.startRunning(); 

} 
} 

이 BTW 내가 텔넷과 같은 컴퓨터에 서버를 실행하고, 나도 몰라.

+0

디버깅을 수행하고 컴파일 할 가장 작은 관련 코드 섹션을 게시하십시오. –

답변

2

ObjectInputStreamObjectOutputStream을 사용하여 문자열을 읽거나 쓰려고합니다. 그들은 객체를 디코딩/인코딩하기 위해 특별한 프로토콜을 사용하고 단순히 텔넷 클라이언트를 사용하여 문자열을 보내는 것은 효과가 없을 것입니다. 귀하의 input.readObject(); 호출이 예외를 throw한다고 가정합니다.

텔넷 클라이언트를 사용하려면 문자열 읽기/쓰기에 BufferedReader#readLineBufferedWriter을 사용하십시오.