看了一些socket的文章,正好可以用JAVA來嘗試,想寫一個GUI的點對點聊天程序。
於是趕了兩天,斷斷續續,其中出現一些小波折,畢竟寫程序還是需要耐心。
剛寫好的GUI界面,因爲流傳輸的問題,而且界面也不是很滿意,於是索性將兩個寫好的類刪掉了。重新來寫,感覺好了許多。
程序其實是C/S模型的,分爲服務端和客戶端,現在將代碼貼上來,分享一下創作經歷。
- //服務端程序
- import java.io.*;
- import java.net.*;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class Server extends JFrame implements ActionListener {
- ServerSocket server;
- Socket socket;
- BufferedReader in;
- PrintWriter out;
- JTextField sendText = new JTextField();;
- JTextArea recieveText = new JTextArea(5, 20);
- JScrollPane scrollpane = new JScrollPane(recieveText);
- JLabel label1 = new JLabel("發送內容:");
- JLabel label2 = new JLabel("接收內容:");
- JButton btnSend = new JButton("發送");
- JButton btnClean = new JButton("清除內容");
- public Server() {
- // TODO Auto-generated constructor stub
- super("服務端");
- Container c = getContentPane();
- c.setLayout(new GridLayout(6, 1, 5, 5));
- c.add(label1);
- c.add(sendText);
- c.add(label2);
- c.add(scrollpane);
- c.add(btnSend);
- c.add(btnClean);
- btnSend.addActionListener(this);
- btnClean.addActionListener(this);
- setSize(400, 400);
- setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
- setVisible(true);
- try {
- socket = new Socket();// 創建套接字
- server = new ServerSocket(5005);// 創建服務器端套接字,指定端口爲5005
- socket = server.accept();// 讓套接字偵聽來自客戶端的請求
- in = new BufferedReader(new InputStreamReader(socket
- .getInputStream()));// 封裝來自套接字的輸入流,使其變成字符流
- out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字輸出流的對象
- while (true) {
- String s = in.readLine();// 讀取套接字輸入流的字符
- recieveText.append("客戶機:" + s + "/n/r");
- }// 在文本框中追加服務器端發來的數據
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new Server();
- }
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- if (e.getSource() == btnClean) {
- sendText.setText("");
- recieveText.setText("");// 清空文本框的內容
- } else if (e.getSource() == btnSend) {
- out.println(sendText.getText());// 向套接字輸出流輸入來自發送文本框的數據
- out.flush();// 刷新該緩衝流
- }
- }
- }
- //客戶端程序
- import java.io.*;
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class Client extends JFrame implements ActionListener {
- Socket socket;
- BufferedReader in;
- PrintWriter out;
- JTextField sendText = new JTextField();;
- JTextArea recieveText = new JTextArea(5, 20);
- JScrollPane scrollpane = new JScrollPane(recieveText);
- JLabel label1 = new JLabel("發送內容:");
- JLabel label2 = new JLabel("接收內容:");
- JButton btnSend = new JButton("發送");
- JButton btnClean = new JButton("清除內容");
- public Client() {
- // TODO Auto-generated constructor stub
- super("客戶端");
- Container c = getContentPane();
- c.setLayout(new GridLayout(6, 1, 5, 5));
- c.add(label1);
- c.add(sendText);
- c.add(label2);
- c.add(scrollpane);
- c.add(btnSend);
- c.add(btnClean);
- btnSend.addActionListener(this);
- btnClean.addActionListener(this);
- setSize(400, 400);
- setDefaultCloseOperation(Server.EXIT_ON_CLOSE);
- setVisible(true);
- try {
- socket = new Socket(InetAddress.getLocalHost(), 5005);// 創建套接字,指定地址和端口
- in = new BufferedReader(new InputStreamReader(socket
- .getInputStream()));// 封裝來自套接字的輸入流,使其變成字符流
- out = new PrintWriter(socket.getOutputStream());// 生成格式化的套接字輸出流的對象
- while (true) {
- String s = in.readLine();// 讀取套接字輸入流的字符
- recieveText.append("服務器:" + s + "/n/r");// 在文本框中追加服務器端發來的數據
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new Client();
- }
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- if (e.getSource() == btnClean) {
- sendText.setText("");// 清空文本框的內容
- recieveText.setText("");
- } else if (e.getSource() == btnSend) {
- out.println(sendText.getText());// 向套接字輸出流輸入來自發送文本框的數據
- out.flush();// 刷新該流的緩衝
- }
- }
- }