用JAVA編程C/S聊天程序

看了一些socket的文章,正好可以用JAVA來嘗試,想寫一個GUI的點對點聊天程序。
於是趕了兩天,斷斷續續,其中出現一些小波折,畢竟寫程序還是需要耐心。
剛寫好的GUI界面,因爲流傳輸的問題,而且界面也不是很滿意,於是索性將兩個寫好的類刪掉了。重新來寫,感覺好了許多。
程序其實是C/S模型的,分爲服務端和客戶端,現在將代碼貼上來,分享一下創作經歷。

  1. //服務端程序
  2. import java.io.*;
  3. import java.net.*;
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import javax.swing.*;
  7. public class Server extends JFrame implements ActionListener {
  8. ServerSocket server;
  9. Socket socket;
  10. BufferedReader in;
  11. PrintWriter out;
  12. JTextField sendText = new JTextField();;
  13. JTextArea recieveText = new JTextArea(520);
  14. JScrollPane scrollpane = new JScrollPane(recieveText);
  15. JLabel label1 = new JLabel("發送內容:");
  16. JLabel label2 = new JLabel("接收內容:");
  17. JButton btnSend = new JButton("發送");
  18. JButton btnClean = new JButton("清除內容");
  19. public Server() {
  20.   // TODO Auto-generated constructor stub
  21.   super("服務端");
  22.   Container c = getContentPane();
  23.   c.setLayout(new GridLayout(6155));
  24.   c.add(label1);
  25.   c.add(sendText);
  26.   c.add(label2);
  27.   c.add(scrollpane);
  28.   c.add(btnSend);
  29.   c.add(btnClean);
  30.   btnSend.addActionListener(this);
  31.   btnClean.addActionListener(this);
  32.   setSize(400400);
  33.   setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
  34.   setVisible(true);
  35.   try {
  36.    socket = new Socket();// 創建套接字
  37.    server = new ServerSocket(5005);// 創建服務器端套接字,指定端口爲5005
  38.    socket = server.accept();// 讓套接字偵聽來自客戶端的請求
  39.    in = new BufferedReader(new InputStreamReader(socket
  40.      .getInputStream()));// 封裝來自套接字的輸入流,使其變成字符流
  41.    out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字輸出流的對象
  42.    while (true) {
  43.     String s = in.readLine();// 讀取套接字輸入流的字符
  44.     recieveText.append("客戶機:" + s + "/n/r");
  45.    }// 在文本框中追加服務器端發來的數據
  46.   } catch (IOException e) {
  47.    // TODO Auto-generated catch block
  48.    e.printStackTrace();
  49.   }
  50. }
  51. /**
  52.   * @param args
  53.   */
  54. public static void main(String[] args) {
  55.   // TODO Auto-generated method stub
  56.   new Server();
  57. }
  58. public void actionPerformed(ActionEvent e) {
  59.   // TODO Auto-generated method stub
  60.   if (e.getSource() == btnClean) {
  61.    sendText.setText("");
  62.    recieveText.setText("");// 清空文本框的內容
  63.   } else if (e.getSource() == btnSend) {
  64.    out.println(sendText.getText());// 向套接字輸出流輸入來自發送文本框的數據
  65.    out.flush();// 刷新該緩衝流
  66.   }
  67. }
  68. }
  69. //客戶端程序
  70. import java.io.*;
  71. import java.net.InetAddress;
  72. import java.net.ServerSocket;
  73. import java.net.Socket;
  74. import java.awt.*;
  75. import java.awt.event.*;
  76. import javax.swing.*;
  77. public class Client extends JFrame implements ActionListener {
  78. Socket socket;
  79. BufferedReader in;
  80. PrintWriter out;
  81. JTextField sendText = new JTextField();;
  82. JTextArea recieveText = new JTextArea(520);
  83. JScrollPane scrollpane = new JScrollPane(recieveText);
  84. JLabel label1 = new JLabel("發送內容:");
  85. JLabel label2 = new JLabel("接收內容:");
  86. JButton btnSend = new JButton("發送");
  87. JButton btnClean = new JButton("清除內容");
  88. public Client() {
  89.   // TODO Auto-generated constructor stub
  90.   super("客戶端");
  91.   Container c = getContentPane();
  92.   c.setLayout(new GridLayout(6155));
  93.   c.add(label1);
  94.   c.add(sendText);
  95.   c.add(label2);
  96.   c.add(scrollpane);
  97.   c.add(btnSend);
  98.   c.add(btnClean);
  99.   btnSend.addActionListener(this);
  100.   btnClean.addActionListener(this);
  101.   setSize(400400);
  102.   setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
  103.   setVisible(true);
  104.   try {
  105.    socket = new Socket(InetAddress.getLocalHost(), 5005);// 創建套接字,指定地址和端口
  106.    in = new BufferedReader(new InputStreamReader(socket
  107.      .getInputStream()));// 封裝來自套接字的輸入流,使其變成字符流
  108.    out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字輸出流的對象
  109.    while (true) {
  110.     String s = in.readLine();// 讀取套接字輸入流的字符
  111.     recieveText.append("服務器:" + s + "/n/r");// 在文本框中追加服務器端發來的數據
  112.    }
  113.   } catch (IOException e) {
  114.    e.printStackTrace();
  115.   }
  116. }
  117. /**
  118.   * @param args
  119.   */
  120. public static void main(String[] args) {
  121.   // TODO Auto-generated method stub
  122.   new Client();
  123. }
  124. public void actionPerformed(ActionEvent e) {
  125.   // TODO Auto-generated method stub
  126.   if (e.getSource() == btnClean) {
  127.    sendText.setText("");// 清空文本框的內容
  128.    recieveText.setText("");
  129.   } else if (e.getSource() == btnSend) {
  130.    out.println(sendText.getText());// 向套接字輸出流輸入來自發送文本框的數據
  131.    out.flush();// 刷新該流的緩衝
  132.   }
  133. }
  134. }
發佈了23 篇原創文章 · 獲贊 1 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章