您好,登錄后才能下訂單哦!
經(jīng)過(guò)這幾天對(duì)java的學(xué)習(xí),用java做了這個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的課程設(shè)計(jì),基于C/S模式的簡(jiǎn)單聊天程序,此篇文章介紹一些客戶端的一些東西。
先講一講此聊天程序的基本原理,客戶端發(fā)送消息至服務(wù)器,服務(wù)器收到消息之后將其轉(zhuǎn)發(fā)給連接服務(wù)器的所有客戶端,來(lái)自客戶端的消息中包含發(fā)件人的名字。
客戶端的主要功能是發(fā)送消息和接收消息,客戶端設(shè)置好了端口和服務(wù)器地址,并創(chuàng)立客戶端自己的套接字,用作和服務(wù)器通信的一個(gè)標(biāo)識(shí)。布局就不多說(shuō)了,主要說(shuō)說(shuō)監(jiān)視器和兩個(gè)重要的線程:發(fā)送和接收。
監(jiān)視器中,登錄按鈕觸發(fā)的功能是設(shè)置用戶名,并且建立和服務(wù)器的連接,同時(shí)還要?jiǎng)?chuàng)建接收線程,并使其開(kāi)始運(yùn)行。
下面說(shuō)一說(shuō),發(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)建一個(gè)布局并初始化 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, "親愛(ài)的你真的要離開(kāi)聊天室么?", " 好好學(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ù)器斷開(kāi)連接\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ā)送失?。何催B接到服務(wù)器\n"); } } } public static void main(String args[]) { Client client = new Client(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。