Socket簡易聊天工具

演示

  • 代碼運行如圖,看起來還不錯,哈哈哈

服務端

package qiu;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.Printable;
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 java.util.Calendar;

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 jTextArea =null;//用來顯示純文本的單行區域
    JTextField jTextField=null;//可以允許用來編輯單行文本
    JButton sendButton=null;
    JPanel jPanel=null;
    JScrollPane jScrollPane =null;
    //把信息發給客戶端對象
    PrintWriter printWriter =null;
/**
  *  服務端的主函數
  * */
public static void main(String[] args) {
    // TODO Auto-generated method stub
       new MyServer();
}
/**
 *  服務端的構造函數,用來進行初始化
 * */
public MyServer(){
    //這裏是對GUI的初始化
    jTextArea = new JTextArea();
    jTextField= new JTextField(20);
    sendButton= new JButton("發送");
    sendButton.addActionListener(this);
    sendButton.setActionCommand("send");
    jScrollPane= new JScrollPane(jTextArea);
    jPanel = new JPanel();
    jPanel.add(jTextField);//添加編輯框
    jPanel.add(sendButton);//添加按鈕

    //將兩個面板添加布局
    this.add(jScrollPane,BorderLayout.CENTER);
    this.add(jPanel,BorderLayout.SOUTH);

    this.setSize(400,300);
    this.setTitle("聊天服務器");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置退出按鈕
    this.setVisible(true);
    this.setResizable(true);    

    //下面是socket服務器的搭建
    try {
        //服務器監聽
        ServerSocket ss = new ServerSocket(9988);
        //等待客戶端連接
        Socket socket = ss.accept();
        //獲得客戶端發送過來的數據的流
        BufferedReader br = new BufferedReader
                (new InputStreamReader(socket.getInputStream()));
        printWriter = new PrintWriter(socket.getOutputStream(),true);
        //讀取從客戶端發送過來的信息
        while(true){
            String info = br.readLine();
            jTextArea.append("客戶端 "+getTime()+"\r\n"+info+"\r\n");
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   }
/**
 * 用來獲取當前的時間
 * @return 當前的時間
 */
public String getTime(){
    //可以對每個單獨時間域進行修改
    Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);//獲取小時
    int minute = c.get(Calendar.MINUTE);
    int second = c.get(Calendar.SECOND);

    return hour+":"+minute+":"+second;  
   }

/**
 * 當button被點擊的時候調用
 */
@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    //當按鈕按下的時候調用
    if(e.getActionCommand().equals("send")){
        //把服務器在jTextField寫的內容發送給客戶端
        String info= jTextField.getText();
        jTextArea.append("服務器 "+getTime()+"\r\n"+info+"\r\n");
        printWriter.println(info);
        //清楚發送框內容
        jTextField.setText("");

        }   
    }
}

客戶端

package qiu;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;

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 jTextArea=null;
    JTextField jTextField=null;
    JPanel jPanel=null;
    JScrollPane jScrollPane=null;
    JButton sendButton=null;
    PrintWriter printWriter=null;

/**
  *  客戶端的主函數
  * */
public static void main(String[] args) {
    // TODO Auto-generated method stub
      new MyClient();
}
/**
 * 客戶端構造函數用來初始化
 * */
public MyClient(){
    //GUI初始化
    jTextArea= new JTextArea();
    jTextField=new JTextField(20);
    sendButton= new JButton("發送");
    sendButton.addActionListener(this);
    sendButton.setActionCommand("send");
    jScrollPane=new JScrollPane(jTextArea);
    jPanel=new JPanel();

    jPanel.add(jTextField);
    jPanel.add(sendButton);

    this.add(jScrollPane,BorderLayout.CENTER);
    this.add(jPanel,BorderLayout.SOUTH);

    this.setSize(400, 300);
    this.setTitle("聊天客戶端");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    this.setResizable(true);    

    //socket通信代碼
     try {
        Socket s= new Socket("127.0.0.1",9988);
        BufferedReader br = new BufferedReader
                (new InputStreamReader(s.getInputStream()));
        printWriter= new PrintWriter(s.getOutputStream(),true);
        while(true){
            //不停的讀取服務器發過來的信息
            String string=br.readLine();
            jTextArea.append("服務器 "+getTime()+"\r\n"+string+"\r\n");
            }

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

/**
  * 用來獲取當前的時間
  * @return 當前的時間
  */
public String getTime(){
    //可以對每個單獨時間域進行修改
    Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);//獲取小時
    int minute = c.get(Calendar.MINUTE);
    int second = c.get(Calendar.SECOND);

    return hour+":"+minute+":"+second;  
}
/**
  * 當button被點擊的時候調用
  */
@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(sendButton.getActionCommand().equals("send")){
        String info= jTextField.getText();
        //將客戶端發送的信息發送給服務端
        jTextArea.append("客戶端 "+getTime()+"\r\n"+info+"\r\n");
        printWriter.println(info);
        jTextField.setText("");
        }
    }
}
發佈了67 篇原創文章 · 獲贊 26 · 訪問量 73萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章