java基于C/S模式實(shí)現(xiàn)聊天程序(客戶端)
經(jīng)過這幾天對java的學(xué)習(xí),用java做了這個計(jì)算機(jī)網(wǎng)絡(luò)的課程設(shè)計(jì),基于C/S模式的簡單聊天程序,此篇文章介紹一些客戶端的一些東西。
先講一講此聊天程序的基本原理,客戶端發(fā)送消息至服務(wù)器,服務(wù)器收到消息之后將其轉(zhuǎn)發(fā)給連接服務(wù)器的所有客戶端,來自客戶端的消息中包含發(fā)件人的名字。
客戶端的主要功能是發(fā)送消息和接收消息,客戶端設(shè)置好了端口和服務(wù)器地址,并創(chuàng)立客戶端自己的套接字,用作和服務(wù)器通信的一個標(biāo)識。布局就不多說了,主要說說監(jiān)視器和兩個重要的線程:發(fā)送和接收。
監(jiān)視器中,登錄按鈕觸發(fā)的功能是設(shè)置用戶名,并且建立和服務(wù)器的連接,同時還要創(chuàng)建接收線程,并使其開始運(yùn)行。
下面說一說,發(fā)送和接收的線程:發(fā)送線程是建立數(shù)據(jù)輸出流,將想要文本輸入?yún)^(qū)中的消息以UTF字符串的形式寫入到數(shù)據(jù)流中,并且在發(fā)送成功后清空輸入框。并且該線程由“發(fā)送”按鈕觸發(fā)。
接收線程是在登錄之后就建立的,線程中建立輸入流,并且讀出流中的UTF字符串,將其顯示到文本展示區(qū),就完成了信息的接收。
客戶端大致的功能和組成就是這些了,下一篇我將講一下有關(guān)服務(wù)器的東西。
界面展示:

package client;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
public class Client extends JFrame {
Socket clientsocket = null;
DataInputStream in = null;
DataOutputStream out = null;
JTextArea inputText;
String SerAddress = "192.168.1.100";
int SendPort = 8888;
JTextField NickName;
JTextArea textShow;
JButton button, setbutton;
public Client() { // 構(gòu)造函數(shù),創(chuàng)建一個布局并初始化
init();
setVisible(true);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setBounds(480, 160, 340, 460);
setTitle("好好學(xué)習(xí)天天向上聊天室");
setResizable(false);
}
void init() { // 初始化函數(shù),設(shè)置布局并且設(shè)置監(jiān)視器
inputText = new JTextArea(4, 29);
button = new JButton(" 發(fā)送 ");
JLabel label = new JLabel("昵稱");
setbutton = new JButton(" 登錄 ");
textShow = new JTextArea(15, 29);
textShow.setEditable(false);
NickName = new JTextField(10);
inputText.setBackground(new Color(45, 210, 209));
setLayout(new FlowLayout());
getContentPane().setBackground(new Color(20, 85, 237));
add(new JScrollPane(textShow));
textShow.setBackground(new Color(45, 210, 209));
setbutton.setBackground(new Color(236, 134, 21));
button.setBackground(new Color(236, 134, 21));
NickName.setBackground(new Color(45, 210, 209));
label.setForeground(new Color(243, 243, 14));
add(label);
add(NickName);
add(setbutton);
add(new JScrollPane(inputText));
add(button);
setbutton.addActionListener(new ActionListener() { //添加監(jiān)視器
public void actionPerformed(ActionEvent e) {
Thread readData;
Read read = null;
try {
clientsocket = new Socket();
read = new Read();
readData = new Thread(read);
if (clientsocket.isConnected()) {
} else {
InetAddress address = InetAddress.getByName(SerAddress);
InetSocketAddress socketAddress = new InetSocketAddress(
address, SendPort);
clientsocket.connect(socketAddress);
textShow.append(new java.text.SimpleDateFormat(
"yy-MM-dd HH:mm:ss").format(new Date())
+ "\n與服務(wù)器連接成功\n已登錄聊天室\n");
in = new DataInputStream(clientsocket.getInputStream());
out = new DataOutputStream(clientsocket
.getOutputStream());
read.setDataInputStream(in);
readData.start();
}
} catch (Exception e1) {
textShow.append(new java.text.SimpleDateFormat(
"yy-MM-dd HH:mm:ss").format(new Date())
+ "\n服務(wù)器連接失敗\n");
}
}
});
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Send send = new Send();
Thread sendData = new Thread(send);
send.setDataOutputStream(out);
sendData.start();
}
});
addWindowListener(new WindowAdapter() { //響應(yīng)關(guān)閉按鈕的功能
public void windowClosing(WindowEvent e) {
int option = JOptionPane
.showConfirmDialog(null, "親愛的你真的要離開聊天室么?",
" 好好學(xué)習(xí),天天向上", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (option == JOptionPane.YES_OPTION)
System.exit(0);
}
});
} // init結(jié)束
class Read implements Runnable { //讀取輸入流的線程
DataInputStream in;
public void setDataInputStream(DataInputStream in) {
this.in = in;
}
public void run() {
String result;
while (true) {
try {
result = in.readUTF();
textShow.append(new java.text.SimpleDateFormat(
"yy-MM-dd HH:mm:ss").format(new Date())
+ "\n"
+ result);
} catch (IOException e) {
textShow.append(new java.text.SimpleDateFormat(
"yy-MM-dd HH:mm:ss").format(new Date())
+ "\n與服務(wù)器斷開連接\n");
break;
}
}
}
}
class Send implements Runnable { // 發(fā)送消息的輸出流線程
DataOutputStream out;
public void setDataOutputStream(DataOutputStream out) {
this.out = out;
}
public void run() {
String message = null;
message = NickName.getText() + ":" + inputText.getText() + "\n";
try {
out.writeUTF(message);
inputText.setText("");
} catch (Exception e2) {
textShow.append("發(fā)送失敗:未連接到服務(wù)器\n");
}
}
}
public static void main(String args[]) {
Client client = new Client();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java中UDP簡單聊天程序?qū)嵗a
- 詳解基于java的Socket聊天程序——客戶端(附demo)
- java網(wǎng)絡(luò)編程學(xué)習(xí)java聊天程序代碼分享
- java基于TCP協(xié)議實(shí)現(xiàn)聊天程序
- 詳解基于java的Socket聊天程序——服務(wù)端(附demo)
- java實(shí)現(xiàn)基于Tcp的socket聊天程序
- 詳解基于java的Socket聊天程序——初始設(shè)計(jì)(附demo)
- java實(shí)現(xiàn)簡單TCP聊天程序
- 基于Java的Socket多客戶端Client-Server聊天程序的實(shí)現(xiàn)
- 用Java實(shí)現(xiàn)聊天程序
相關(guān)文章
java實(shí)現(xiàn)簡單的汽車租賃系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單的汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
IDEA之web項(xiàng)目導(dǎo)入jar包方式
這篇文章主要介紹了IDEA之web項(xiàng)目導(dǎo)入jar包方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java 使用poi把數(shù)據(jù)庫中數(shù)據(jù)導(dǎo)入Excel的解決方法
本篇文章介紹了,Java 使用poi把數(shù)據(jù)庫中數(shù)據(jù)導(dǎo)入Excel的解決方法。需要的朋友參考下2013-05-05
idea 實(shí)現(xiàn)git rebase操作應(yīng)用場景
本文結(jié)合idea工具進(jìn)行rebase的各種場景的操作,借助工具更能直觀地觀察到分支之間地操作差異,方便我們理解rebase的各種操作以及場景的使用,對idea git rebase操作知識感興趣的朋友一起看看吧2024-01-01
springsecurity基于token的認(rèn)證方式
本文主要介紹了springsecurity基于token的認(rèn)證方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

