JAVA基於TCP和Swing的聊天程式
阿新 • • 發佈:2019-01-07
JAVA基於TCP和Swing的聊天程式
server端程式:
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyServer extends JFrame implements ActionListener { JTextArea jta = null; JTextField jtf = null; JButton jb = null; JPanel jp1 = null; JScrollPane jsp = null; PrintWriter pw = null; public static void main(String[] args) { new MyServer(); } public MyServer() { jta = new JTextArea(); jsp = new JScrollPane(jta); jtf = new JTextField(10); // 註冊回車事件 jtf.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { sendMessage(); } } }); jb = new JButton("傳送"); jb.addActionListener(this);// 註冊一個監聽事件 jp1 = new JPanel(); jp1.add(jtf); jp1.add(jb); this.add(jsp, BorderLayout.CENTER); this.add(jp1, BorderLayout.SOUTH); this.setTitle("chat server"); this.setSize(300, 200); this.setVisible(true); // 接收從客戶端傳送過來的訊息 try { ServerSocket ss = new ServerSocket(6000); Socket s = ss.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); pw = new PrintWriter(s.getOutputStream(), true);// 寫成pw = new PrintWriter(s.getOutputStream())會有問題 while (true) { String info = in.readLine(); String str = null; if (jta.getText() == null || "".equals(jta.getText())) { str = "Client:" + info; } else { str = jta.getText() + "\r\nClient:" + info; } jta.setText(str); jta.setCaretPosition(jta.getDocument().getLength()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 把資訊給客戶端 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (e.getSource() == jb) { sendMessage(); } } /** * @Description: 傳送訊息給客戶端 * @throws */ public void sendMessage() { String info = jtf.getText(); pw.println(info); pw.flush(); jtf.setText(""); if (jta.getText() == null || "".equals(jta.getText())) { jta.append("Server:" + info); } else { jta.append("\r\nServer:" + info); } jta.setCaretPosition(jta.getDocument().getLength());// 設定滾動條自動滾動 } }
client端程式:
package cn.Chat; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyClient extends JFrame implements ActionListener { JTextArea jta = null; JTextField jtf = null; JButton jb = null; JPanel jp1 = null; JScrollPane jsp = null; PrintWriter pw = null; public static void main(String[] args) { new MyClient(); } public MyClient() { jta = new JTextArea();//文字區 jsp = new JScrollPane(jta);//滾動面板 jtf = new JTextField(10);//文字框 // 註冊回車事件 jtf.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { sendMessage(); } } }); jb = new JButton("傳送"); jb.addActionListener(this);// 註冊一個監聽事件 jp1 = new JPanel(); jp1.add(jtf); jp1.add(jb); this.add(jsp, BorderLayout.CENTER); this.add(jp1, BorderLayout.SOUTH); this.setTitle("chat client"); this.setSize(300, 200); this.setVisible(true); // 接收從服務端傳送過來的訊息 try { Socket s = new Socket("127.0.0.1", 6000); BufferedReader in = new BufferedReader(new InputStreamReader(s .getInputStream())); pw = new PrintWriter(s.getOutputStream(), true); while (true) { String info = in.readLine(); String str = null; if (jta.getText() == null || "".equals(jta.getText())) { str = "Server:" + info; } else { str = jta.getText() + "\r\nServer:" + info; } jta.setText(str); jta.setCaretPosition(jta.getDocument().getLength()); } } catch (IOException e) { e.printStackTrace(); } } // 把資訊給伺服器端 @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == jb) { sendMessage(); } } /** * @Description: 傳送訊息給伺服器端 * @throws */ public void sendMessage() { String info = jtf.getText(); pw.println(info); pw.flush(); jtf.setText(""); if (jta.getText() == null || "".equals(jta.getText())) { jta.append("Client:" + info); } else { jta.append("\r\nClient:" + info); } jta.setCaretPosition(jta.getDocument().getLength());// 設定滾動條自動滾動 } }
執行效果: