Java實現簡易聊天室


Java實現簡易聊天室

在學習《Java從入門到精通》這本書,網絡通信,基於TCP實現的簡易聊天室,我這里對書中的代碼略做了修改,做個記錄。

 

這里先放一下運行效果圖,代碼放在最后。

 

運行效果:

先啟動服務器端:

 

 

啟動客戶端:

 

 發送數據:

 

 

 主要的功能就是上面那些,在代碼中我還添加一些功能,比如說給JTextField添加了焦點監聽器,以及輸入框為空的檢查和提示,但總的來說還是比較簡單,如果要實現健壯的聊天室程序還需要再做些修改。

 

下面放下代碼,比較簡單,就服務器端和客戶端兩個代碼。

 

服務器端代碼:

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import static java.lang.System.out; public class MyTcp { private BufferedReader reader; private ServerSocket server; private Socket socket; void getServer(){ try { server=new ServerSocket(8998);        //實例化Socket對象
            out.println("服務器套接字已創建成功"); while(true) { out.println("等待客戶機的連接"); socket=server.accept();           //accept()方法會返回一個和客戶端Socket對象相連的Socket對象
                reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); getClientMessage(); } }catch(Exception e) { e.printStackTrace(); } } //讀取客戶端發送過來的信息
    private void getClientMessage() { try { while(true) { //獲得客戶端信息
                out.println("客戶機:"+reader.readLine()); } }catch(Exception e) { e.printStackTrace(); } try { if(reader!=null) { reader.close(); } if(socket!=null) { socket.close(); } }catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { MyTcp tcp=new MyTcp(); tcp.getServer(); } }

 

 

 

客戶端代碼:

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.io.PrintWriter; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.BevelBorder; public class MyClient extends JFrame{ private PrintWriter writer; Socket socket; private JTextArea ta=new JTextArea(); private JTextField tf=new JTextField(); Container cc; public MyClient(String title) { super(title); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cc=this.getContentPane(); final JScrollPane scrollPane=new JScrollPane(); scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)); getContentPane().add(scrollPane,BorderLayout.CENTER); scrollPane.setViewportView(ta); cc.add(tf,"South"); tf.addFocusListener(new JTextFieldListener(tf,"請在此輸入內容")); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(tf.getText().isEmpty()) { JOptionPane.showMessageDialog(MyClient.this, "請輸入內容!"); }else { writer.println(tf.getText()); ta.append(tf.getText()+"\n"); ta.setSelectionEnd(ta.getText().length()); tf.setText(""); } } }); } //焦點監聽器
    class JTextFieldListener implements FocusListener{ private String hintText;          //提示文字
        private JTextField textField; public JTextFieldListener(JTextField textField,String hintText) { this.textField=textField; this.hintText=hintText; textField.setText(hintText); //默認直接顯示
 textField.setForeground(Color.GRAY); } @Override public void focusGained(FocusEvent e) { //獲取焦點時,清空提示內容
            String temp=textField.getText(); if(temp.equals(hintText)){ textField.setText(""); textField.setForeground(Color.BLACK); } } @Override public void focusLost(FocusEvent e) { //失去焦點時,沒有輸入內容,顯示提示內容
            String temp=textField.getText(); if(temp.equals("")) { textField.setForeground(Color.GRAY); textField.setText(hintText); } } } private void connect() { ta.append("嘗試連接\n"); try { socket=new Socket("127.0.0.1",8998); writer=new PrintWriter(socket.getOutputStream(),true); ta.append("完成連接\n"); }catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { //EventQueue事件隊列,封裝了異步事件指派機制
        EventQueue.invokeLater(new Runnable(){ public void run() { MyClient client=new MyClient("向服務器發送數據"); client.setSize(400,400); client.setVisible(true); client.connect(); } }); } }

 

 

啟動的時候要注意先啟動服務器端再啟動客戶端,不然會報錯。

 

 

 

 

 

菜鳥還需要不斷學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM