2012-11-23 195 views
-2

我是Java新用户。我正在尝试使用一个客户端来制作一个简单的聊天应用程序,但有些事情是不正确的。当试图收听时,它会连接到服务器(紧接着它)。想法很简单:客户端发送一条消息,服务器接收它并将其发回。请帮忙...!Java聊天服务器客户端

主营:

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

什么不起作用,服务器或客户端? – Mordechai

+0

客户端挂断。 – Guy

+0

是否保持'PrintStrims'变量全局,每次消息发送时都不重新创建帮助? – Mordechai

回答

0

聊天服务器和客户端,我想SUG可以使用OpenFire服务器和Smack API。对于Smack示例,Here是一个很好的参考。 DownloadOpenFire服务器。

0

如果您的服务器在连接后从客户端获取任何内容,将会有帮助。这样我们就可以确定服务器是否没有收到回复消息或者客户端没有收到回复消息。

这个oracle教程可能对你有帮助,因为它看起来像使用了gui,并且很好地解释了客户端和服务器如何与代码一起工作。 http://www.oracle.com/technetwork/java/socket-140484.html

相反有可能是在

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

出了故障,逻辑分析,你可能想确保你真正可以进入该声明