2012-11-23 4 views
-2

나는 자바가 좋다. 나는 하나의 클라이언트와 간단한 채팅 응용 프로그램을 만들려고 노력하고 있지만, 뭔가 옳지 않다. 이해할 수 없다. 그것을 듣고 자 할 때 (바로 직후) 서버에 연결이 끊어집니다. 아이디어는 간단합니다. 클라이언트가 메시지를 보내고 서버가 메시지를 수신하여 다시 보냅니다. 도와주세요...!자바 채팅 서버 - 클라이언트

홈페이지 :

public class main { 
public static void main(String[] args) { 
    Server Server = new Server(); 
    Server.runServer();   

    Client client = new Client(); 
    client.runForm(); 
} 
} 

서버

public class Server { 

public static int SERVERA_PORTS = 5432; 
private static JTextArea txtMessages; 
public static void main(String[] args) { 

} 

public void runServer() { 
    //Form 
    JFrame frame = new JFrame(); 
    txtMessages = new JTextArea(); 
    JPanel pnlContent = (JPanel) frame.getContentPane(); 
    pnlContent.setLayout(new BorderLayout()); 
    pnlContent.add(txtMessages, BorderLayout.CENTER); 
    txtMessages.setEditable(false); 
    frame.setSize(500, 400); 
    frame.setLocation(100, 100); 
    frame.setTitle("Console"); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setVisible(true);   
    txtMessages.append("Listening!\n*************************\n"); 

    ServerSocket serverSocket = null; 
    try{ 
      serverSocket = new ServerSocket(SERVERA_PORTS); 
    } catch (IOException ex){ 

      return; 
    } 

    while(true){ 
     Socket socket = null; 
     try{ 
      socket = serverSocket.accept(); 
      System.out.println("Client: "+socket.getRemoteSocketAddress()+" connected");       
      InputStreamReader IntputaReaders = new InputStreamReader(socket.getInputStream()); 
      BufferedReader BuferaReaders = new BufferedReader(IntputaReaders); 

      DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
      Date date = new Date();        
      String msg = BuferaReaders.readLine(); 
      System.out.println(dateFormat.format(date)+": "+msg); 

      //Sends back to clint 
      PrintStream PrintStrims = new PrintStream(socket.getOutputStream()); 
      if(!"".equals(msg)) { 
       PrintStrims.println(dateFormat.format(date)+": "+msg); 
      } 

      //Puts in GUI 
      txtMessages.append(socket.getRemoteSocketAddress()+": "+msg+"\n"); 



     } catch (IOException ex){ 
     } finally { 
       try{ 
         socket.close(); 
       } catch (Exception ex){} 
     } 
    } 
} 

} 

채팅 서버와 클라이언트에 대한 클라이언트

public class Client extends JFrame implements ActionListener { 

private static JButton btnSend; 
private static JButton btnConnect; 
private static JTextArea txtMessages; 
private static JTextField txtCurrentMessage; 
private static JTextField txtServerPort; 
private static JTextField txtServerName; 

String hosts = ""; 
int ports; 
Socket clientSocket = null; 
BufferedReader in = null; 

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

}  

private void listen() { 
    try { 
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String msgIn; 
     while ((msgIn = in.readLine()) != null) { 
      System.out.println(msgIn); 
      txtMessages.append(msgIn+"\n"); 
     }   
    }catch (IOException ez) { 

    } 
} 


public void connect(){   
     hosts = txtServerName.getText();   
     String strPort = txtServerPort.getText(); 
     ports = Integer.valueOf(strPort);     

    try{ 
     //Ja pieslēdzas 
     clientSocket = new Socket(hosts, ports); 
     btnSend.setEnabled(true); 
     txtMessages.append("U R connected!\n**************\n"); 
     btnConnect.setEnabled(false); 
     txtCurrentMessage.setEnabled(true); 

    } catch (IOException ex){ 
     txtMessages.append("Cannot connect.. \n"); 
    }  
} 

public void send(){ 
    try{ 
     PrintStream PrintStrims = new PrintStream(clientSocket.getOutputStream());  
     String message = txtCurrentMessage.getText(); 
     PrintStrims.println(message); 
     System.out.println(message); 

    } catch (IOException ex){ 
    }  
} 

public void runForm() { 
    JFrame frame = new JFrame(); 
    txtServerName = new JTextField(); 
    txtServerName.setPreferredSize(new Dimension(150, 21)); 
    txtServerPort = new JTextField(); 
    txtServerPort.setPreferredSize(new Dimension(50, 21)); 
    txtMessages = new JTextArea(); 
    txtCurrentMessage = new JTextField(); 
    txtCurrentMessage.setPreferredSize(new Dimension(350,21)); 
    btnConnect = new JButton("Connect"); 
    btnConnect.addActionListener(this); 
    btnSend = new JButton("Send"); 
    btnSend.addActionListener(this); 
    JPanel pnlTop = new JPanel(new FlowLayout()); 
    JPanel pnlBottom = new JPanel(new FlowLayout()); 
    pnlTop.add(txtServerName); 
    pnlTop.add(txtServerPort); 
    pnlTop.add(btnConnect); 
    pnlBottom.add(txtCurrentMessage); 
    pnlBottom.add(btnSend); 
    JPanel pnlContent = (JPanel) frame.getContentPane(); 
    pnlContent.setLayout(new BorderLayout()); 
    pnlContent.add(pnlTop, BorderLayout.NORTH); 
    pnlContent.add(txtMessages, BorderLayout.CENTER); 
    pnlContent.add(pnlBottom, BorderLayout.SOUTH); 
    frame.setLayout(new BorderLayout()); 
    frame.add(pnlTop, BorderLayout.NORTH); 
    frame.add(txtMessages, BorderLayout.CENTER); 
    frame.add(pnlBottom, BorderLayout.SOUTH); 
    frame.setSize(500, 400); 
    frame.setLocation(100, 100); 
    frame.setTitle("Ne pārāk labs čats"); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    txtServerName.setText("127.0.0.1"); 
    txtServerPort.setText("5432");  
    btnSend.setEnabled(false); 
    txtCurrentMessage.setEnabled(false); 
    txtMessages.setEditable(false); 
    frame.setVisible(true); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == btnSend) { 
     if(!"".equals(txtCurrentMessage.getText())) 
     { 
      send();   
      txtCurrentMessage.setText(""); 
     } 
    } 

    if (e.getSource() == btnConnect) {    
      connect(); 
      listen(); 

    }   
} 
} 
+0

로 얻을 수 있는지 확인 할 수 있습니다

if(!"".equals(msg)) { PrintStrims.println(dateFormat.format(date)+": "+msg); } 

의 논리에 문제가 될 수 있을까? – Mordechai

+0

클라이언트가 끊깁니다. – Guy

+0

메시지가 전송 될 때마다 'PrintStrims' 변수를 전역으로 유지하면서 도움을 줍니까? – Mordechai

답변

0

, 나는 설탕 없 싶습니다 OpenFire 서버와 Smack API를 사용하십시오. HereSmack 예의 좋은 참조입니다. DownloadOpenFire 서버.

0

연결 후 서버가 클라이언트에서 무엇인가를 얻는 지 확인하는 것이 도움이됩니다. 그런 식으로 서버가 메시지를 다시 보내지 않거나 클라이언트가 반환 메시지를받지 못하면 확인할 수 있습니다.

이 Oracle 튜토리얼은 GUI를 사용하는 것처럼 보이며 클라이언트와 서버가 코드를 어떻게 사용 하는지를 설명하는 데 도움이 될 수 있습니다. http://www.oracle.com/technetwork/java/socket-140484.html

는 반대로 당신이 실제로 서버 또는 클라이언트를 작동하지 않는 무슨 문

관련 문제