最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java基于C/S模式實現(xiàn)聊天程序(客戶端)

 更新時間:2019年01月09日 11:45:48   作者:愛在夢醒時分  
這篇文章主要為大家詳細介紹了java基于C/S模式實現(xiàn)聊天程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下

經(jīng)過這幾天對java的學(xué)習(xí),用java做了這個計算機網(wǎng)絡(luò)的課程設(shè)計,基于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)建接收線程,并使其開始運行。

下面說一說,發(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ā)送失?。何催B接到服務(wù)器\n");
  }

 }
 }

 public static void main(String args[]) {
 Client client = new Client();
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

高州市| 皋兰县| 通辽市| 锡林浩特市| 崇义县| 古蔺县| 故城县| 吉木乃县| 巫溪县| 阜宁县| 马公市| 荔浦县| 冀州市| 绍兴县| 朔州市| 绥化市| 南漳县| 金昌市| 嘉峪关市| 建瓯市| 宜宾市| 安康市| 渭南市| 文水县| 安平县| 宁强县| 钟山县| 虞城县| 义乌市| 民权县| 突泉县| 呈贡县| 马龙县| 保山市| 宜都市| 闽清县| 巫山县| 曲沃县| 老河口市| 汉沽区| 名山县|