Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序
介紹
實(shí)現(xiàn)的功能、步驟:
1、定義JFrame窗體中的組件
2、在構(gòu)造方法中初始化窗體的組件
3、使用網(wǎng)絡(luò)編程完成數(shù)據(jù)的傳輸(TCP,UDP協(xié)議)
4、實(shí)現(xiàn)發(fā)送按鈕的監(jiān)聽點(diǎn)擊事件
5、實(shí)現(xiàn)回車鍵發(fā)送數(shù)據(jù)
功能演示
沒有點(diǎn)發(fā)送,數(shù)據(jù)卻發(fā)送出去了是因?yàn)榘戳嘶剀囨I

運(yùn)用到的知識(shí)點(diǎn)
GUI:java實(shí)現(xiàn)窗體、Swing。其實(shí)JAVA Swing的GUI目前企業(yè)中已經(jīng)不用了,主要是一些學(xué)校和培訓(xùn)機(jī)構(gòu)用來教導(dǎo)學(xué)生寫一些游戲、小項(xiàng)目,練練手的。
TCP(Transmission Control Protocol):傳輸控制協(xié)議。
核心代碼
服務(wù)端
注意:一定要先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端。不然會(huì)造成數(shù)據(jù)丟失
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//服務(wù)端
//注意:一定要先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端,不然會(huì)造成數(shù)據(jù)丟失
public class QQ簡(jiǎn)易聊天功能 extends JFrame implements ActionListener, KeyListener {
public static void main(String[] args) {
//調(diào)用構(gòu)造方法
new QQ簡(jiǎn)易聊天功能();
}
//文本域
private JTextArea jta;
//滾動(dòng)條
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按鈕
private JButton jb;
//輸出流
private BufferedWriter bw=null;
//構(gòu)造方法
public QQ簡(jiǎn)易聊天功能(){
//初始化組件
jta=new JTextArea();
//設(shè)置文本域不可編輯
jta.setEditable(false);
//將文本域添加到滾動(dòng)條中,實(shí)現(xiàn)滾動(dòng)效果
jsp=new JScrollPane(jta);
//面板
jp=new JPanel();
jtf=new JTextField(10);
jb=new JButton("發(fā)送");
//將文本框和按鈕添加到面板中
jp.add(jtf);
jp.add(jb);
//將滾動(dòng)條和面板都添加到窗體中
this.add(jsp, BorderLayout.CENTER);
this.add(jp,BorderLayout.SOUTH);
this.setTitle("QQ聊天服務(wù)端");
this.setSize(300,300);
this.setLocation(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//設(shè)置組件顯示
//TCP服務(wù)端
//給發(fā)送按鈕綁定一個(gè)監(jiān)聽點(diǎn)擊事件
jb.addActionListener(this);
//給文本框綁定一個(gè)鍵盤點(diǎn)擊事件
jtf.addKeyListener(this);
try{
//創(chuàng)建一個(gè)服務(wù)端的套接字
ServerSocket serverSocket=new ServerSocket(8888);
//等待客戶端的連接
Socket socket=serverSocket.accept();
//獲取Socket通道的輸入流
//InputStream in=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//獲取Socket通道的輸出流
bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//讀取數(shù)據(jù)
String Line=null;
while ((Line=br.readLine())!=null){
jta.append(Line+System.lineSeparator());//拼接后換行
}
//關(guān)閉serverSocket通道
serverSocket.close();
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
//調(diào)用發(fā)送數(shù)據(jù)的方法
data();
}
//行為
@Override
public void keyPressed(KeyEvent e) {
//判斷是否是回車鍵
if(e.getKeyCode()==KeyEvent.VK_ENTER);{
//發(fā)送數(shù)據(jù)到Socket管道中
data();
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
//定義一個(gè)方法,實(shí)現(xiàn)發(fā)送數(shù)據(jù)到Socket管道中
private void data(){
//獲取文本框中的內(nèi)容
String text=jtf.getText();
//拼接需要發(fā)送的內(nèi)容
text=this.getTitle()+": "+text;//獲取發(fā)送人的名字和內(nèi)容
//發(fā)送
try {
bw.write(text);
bw.newLine();//換行
bw.flush();//刷新
//發(fā)送完后,文本框內(nèi)應(yīng)沒有內(nèi)容
jtf.setText(null);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}客戶端
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
class 客戶端 extends JFrame implements ActionListener,KeyListener{
public static void main(String[] args) {
//調(diào)用構(gòu)造方法
new 客戶端();
}
//文本域
private JTextArea jta;
//滾動(dòng)條
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按鈕
private JButton jb;
//輸出流
private BufferedWriter bw=null;
//構(gòu)造方法
public 客戶端() {
//初始化組件
jta=new JTextArea();
//設(shè)置文本域不可編輯
jta.setEditable(false);
//將文本域添加到滾動(dòng)條中,實(shí)現(xiàn)滾動(dòng)效果
jsp=new JScrollPane(jta);
//面板
jp=new JPanel();
jtf=new JTextField(10);
jb=new JButton("發(fā)送");
//將文本框和按鈕添加到面板中
jp.add(jtf);
jp.add(jb);
//將滾動(dòng)條和面板都添加到窗體中
this.add(jsp, BorderLayout.CENTER);
this.add(jp,BorderLayout.SOUTH);
this.setTitle("QQ聊天客戶端");
this.setSize(300,300);
this.setLocation(600,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//設(shè)置組件顯示
//給發(fā)送按鈕綁定一個(gè)監(jiān)聽點(diǎn)擊事件
jb.addActionListener(this);
//給文本框綁定一個(gè)鍵盤點(diǎn)擊事件
jtf.addKeyListener(this);
try {
//TCP客戶端
//創(chuàng)建一個(gè)客戶端的套接字(嘗試連接)
Socket socket=new Socket("127.0.0.1",8888);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//獲取Socket通道的輸出流
bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//讀取數(shù)據(jù)
String Line=null;
while ((Line=br.readLine())!=null){
jta.append(Line+System.lineSeparator());//拼接后換行
}
//關(guān)閉Socket通道
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
//調(diào)用發(fā)送數(shù)據(jù)的方法
data();
}
@Override
public void keyPressed(KeyEvent e) {
//判斷是否是回車鍵
if(e.getKeyCode()==KeyEvent.VK_ENTER);{
//發(fā)送數(shù)據(jù)到Socket管道中
data();
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
//定義一個(gè)方法,實(shí)現(xiàn)發(fā)送數(shù)據(jù)到Socket管道中
private void data(){
//獲取文本框中的內(nèi)容
String text=jtf.getText();
//拼接需要發(fā)送的內(nèi)容
text=this.getTitle()+": "+text;//獲取發(fā)送人的名字和內(nèi)容
//發(fā)送
try {
bw.write(text);
bw.newLine();//換行
bw.flush();//刷新
//發(fā)送完后,文本框內(nèi)應(yīng)沒有內(nèi)容
jtf.setText(null);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}其實(shí)兩個(gè)實(shí)現(xiàn)類百分之九十以上的代碼都是一樣的,只不過稍微有點(diǎn)名稱的變動(dòng)而已。
以上就是Java模擬QQ實(shí)現(xiàn)聊天互動(dòng)程序的詳細(xì)內(nèi)容,更多關(guān)于Java聊天互動(dòng)程序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot 創(chuàng)建容器的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Spring?MVC文件請(qǐng)求處理MultipartResolver詳解
這篇文章主要介紹了Spring?MVC文件請(qǐng)求處理詳解:MultipartResolver,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)-連接數(shù)據(jù)庫(kù)并把得分寫入數(shù)據(jù)庫(kù)
這篇文章給大家分享了Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)中連接數(shù)據(jù)庫(kù)并把得分寫入數(shù)據(jù)庫(kù)的相關(guān)知識(shí)點(diǎn)和代碼,有興趣的可以學(xué)習(xí)參考下。2018-07-07
SpringCloud?hystrix斷路器與全局解耦全面介紹
什么是服務(wù)降級(jí)?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量,對(duì)一些服務(wù)和頁面有策略的不處理或換種簡(jiǎn)單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運(yùn)作或高效運(yùn)作2022-10-10

