java實(shí)現(xiàn)簡(jiǎn)單聊天室單人版
本文實(shí)例為大家分享了java實(shí)現(xiàn)簡(jiǎn)單聊天室的具體代碼,供大家參考,具體內(nèi)容如下
先整理下思路:
1.創(chuàng)建一個(gè)通信服務(wù)端,傳入端口號(hào)和相關(guān)的流后等待客戶(hù)端連接,并初始化圖形界面。
2.創(chuàng)建一個(gè)JFrame,用于寫(xiě)出聊天的界面,這里界面名稱(chēng)由其他類(lèi)傳入。
3.把客戶(hù)端創(chuàng)建的方法寫(xiě)進(jìn)JFrame(當(dāng)然這里很粗糙的方法)
4.設(shè)置按鈕的監(jiān)聽(tīng)事件,發(fā)送消息和離線功能
首先創(chuàng)建一個(gè)服務(wù)端的類(lèi)
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import com.jero.jframe.ChatSocketJFrame;
//創(chuàng)建服務(wù)端
public class ChatServerSocket{
//構(gòu)造初始化方法
public ChatServerSocket(String name,int port) throws IOException{
//創(chuàng)建Socket服務(wù)連接對(duì)象
ServerSocket serverSocket = new ServerSocket(port);
//等待客戶(hù)端連接
Socket client = serverSocket.accept();
//初始化聊天界面
try {
new ChatSocketJFrame(name,client);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//關(guān)閉流
serverSocket.close();
}
public static void main(String[] args) throws Exception{
new ChatServerSocket("服務(wù)端",8001);//啟動(dòng)服務(wù)端,指定網(wǎng)名和端口
}
}
package com.jero.jframe;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import com.jero.socket.ChatServerSocket;
import javax.swing.JTextPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
public class ChatSocketJFrame extends JFrame implements ActionListener {
private Socket socket;
private String name;
private JButton BT_SEND,BT_LEAVE,BT_LOGIN;
private JTextArea textArea;
private JPanel contentPane;
private JTextField textField;
private PrintWriter cout;
/**
* Launch the application.
* @throws Exception
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException, Exception {
//實(shí)例化界面以及客戶(hù)端
new ChatSocketJFrame("客戶(hù)端","127.0.0.1",8001);
}
/**
* Create the frame.
*/
public ChatSocketJFrame(String name, Socket socket)throws Exception, IOException {
//聊天室界面
super("聊天室"+name+" "+InetAddress.getLocalHost()+" "+socket.getPort());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 733, 519);
this.textArea = new JTextArea();
this.textArea.setEditable(false);
this.getContentPane().add(new JScrollPane(this.textArea));
JPanel panel = new JPanel();
this.getContentPane().add(panel, "South");
this.textField = new JTextField(16);
panel.add(this.textField);
BT_SEND = new JButton("發(fā)送");
panel.add(BT_SEND);
BT_SEND.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("按鈕已點(diǎn)擊");
cout.println(name+"說(shuō): "+textField.getText()+"\n");
textArea.append("我說(shuō): "+textField.getText()+"\n");
textField.setText("");
}
});
BT_LEAVE = new JButton("離線");
panel.add(BT_LEAVE);
BT_LEAVE.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
textArea.append("我離線");
cout.println(name+"離線\n"+"bye");
BT_LEAVE.setEnabled(false);
BT_SEND.setEnabled(false);
}
});
this.setVisible(true);
//開(kāi)始創(chuàng)建通信
this.socket = socket;
this.name = name;
//獲得Socket的輸出流并立即刷新
this.cout = new PrintWriter(socket.getOutputStream(),true);
//把網(wǎng)名傳給對(duì)方
this.cout.println(name);
//獲得Socket對(duì)象的輸入流,創(chuàng)建字符輸入流
BufferedReader buff = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//接受對(duì)方的網(wǎng)名
String aline = buff.readLine();
//顯示對(duì)方發(fā)送的內(nèi)容
textArea.append("連接"+aline+"成功!!\n");
aline = buff.readLine();
//如果內(nèi)容不為空并且對(duì)方不離線,則相互傳送消息
while(aline!=null&&!aline.equals("bye")){
textArea.append(aline+"\r\n");
aline = buff.readLine();
}
//當(dāng)對(duì)方離線時(shí),關(guān)閉所有的流
buff.close();
cout.close();
socket.close();
//把按鈕設(shè)置為不可操作
BT_SEND.setEnabled(false);
BT_LEAVE.setEnabled(false);
}
/**
* @wbp.parser.constructor
*/
public ChatSocketJFrame(String name,String host,int port) throws UnknownHostException, IOException, Exception{
//創(chuàng)建客戶(hù)端
this(name,new Socket(host,port));
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//可以把動(dòng)作監(jiān)聽(tīng)寫(xiě)進(jìn)此函數(shù),這個(gè)就不演示了
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java NIO實(shí)戰(zhàn)之聊天室功能詳解
- Java NIO Selector用法詳解【含多人聊天室實(shí)例】
- java編程實(shí)現(xiàn)多人聊天室功能
- java聊天室的實(shí)現(xiàn)代碼
- Java GUI編程實(shí)現(xiàn)在線聊天室
- Java編程實(shí)現(xiàn)基于TCP協(xié)議的Socket聊天室示例
- Java Socket通信之聊天室功能
- Java continue break制作簡(jiǎn)單聊天室程序
- java利用Socket實(shí)現(xiàn)聊天室功能實(shí)例
- java基于netty NIO的簡(jiǎn)單聊天室的實(shí)現(xiàn)
相關(guān)文章
Java實(shí)現(xiàn)動(dòng)物換位游戲完整?過(guò)程詳解
大家好,今天嘗試用Java編程設(shè)計(jì)一個(gè)GUI界面的動(dòng)物換位游戲,游戲的結(jié)果是讓左右兩組的動(dòng)物交換位置,以下是具體設(shè)計(jì)過(guò)程,供大家參考2022-07-07
controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問(wèn)題
這篇文章主要介紹了controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
一文帶你深入了解Java中延時(shí)任務(wù)的實(shí)現(xiàn)
延時(shí)任務(wù)相信大家都不陌生,在現(xiàn)實(shí)的業(yè)務(wù)中應(yīng)用場(chǎng)景可以說(shuō)是比比皆是。這篇文章主要為大家介紹幾種實(shí)現(xiàn)延時(shí)任務(wù)的辦法,感興趣的可以了解一下2022-11-11
mybatisplus中EntityWrapper的常用方法
這篇文章主要介紹了mybatisplus中EntityWrapper的常用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java多線程案例實(shí)戰(zhàn)之定時(shí)器的實(shí)現(xiàn)
在Java中可以使用多線程和定時(shí)器來(lái)實(shí)現(xiàn)定時(shí)任務(wù),下面這篇文章主要給大家介紹了關(guān)于Java多線程案例之定時(shí)器實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解
這篇文章主要為大家介紹了JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

