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

java實現(xiàn)在線聊天系統(tǒng)

 更新時間:2022年09月15日 11:20:41   作者:sd訫訴sd  
這篇文章主要為大家詳細介紹了java實現(xiàn)在線聊天系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現(xiàn)在線聊天系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

本博客是博主在觀看相關(guān)視頻后寫下的代碼,希望能夠幫助大家掌握java socket的相關(guān)知識。

  • 原理介紹
  • 代碼展示

原理介紹

一、搭建服務(wù)器端

a)、創(chuàng)建ServerSocket對象綁定監(jiān)聽端口。
b)、通過accept()方法監(jiān)聽客戶端的請求。
c)、建立連接后,通過輸入輸出流讀取客戶端發(fā)送的請求信息。
d)、通過輸出流向客戶端發(fā)送請求信息。
e)、關(guān)閉相關(guān)資源。

二、搭建客戶器端

a)、創(chuàng)建Socket對象,指明需要連接的服務(wù)器的地址和端口。
b)、建立連接后,通過輸出流向服務(wù)器發(fā)送請求信息。
c)、通過輸入流獲取服務(wù)器的響應(yīng)信息。
d)、關(guān)閉響應(yīng)資源

代碼展示

服務(wù)器端代碼:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;

/**
?* 版本三:轉(zhuǎn)發(fā)給其他的客戶端 1.保存每一個客戶端的連接
?*
?*/
public class ChatSeverEdition3 {
? ? // 服務(wù)器端是否啟動
? ? boolean started = false;
? ? ServerSocket serverSocket = null;
? ? ArrayList<Client> clients = new ArrayList<Client>();

? ? public static void main(String[] args) {

? ? ? ? new ChatSeverEdition3().start();
? ? }

? ? public void start() {

? ? ? ? try {
? ? ? ? ? ? serverSocket = new ServerSocket(8888);
? ? ? ? ? ? started = true;
? ? ? ? } catch (BindException e) {
? ? ? ? ? ? // 多次啟動服務(wù)器
? ? ? ? ? ? System.out.println("端口使用中。。。。");
? ? ? ? ? ? System.out.println("請關(guān)掉相關(guān)程序,并重新運行服務(wù)器!");
? ? ? ? ? ? System.exit(0);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }

? ? ? ? try {

? ? ? ? ? ? while (started) {
? ? ? ? ? ? ? ? // 客戶端是否連接
? ? ? ? ? ? ? ? Socket socket = serverSocket.accept();
? ? ? ? ? ? ? ? // main()方法是static方法,不能在其中new動態(tài)類Client
? ? ? ? ? ? ? ? Client client = new Client(socket);
? ? ? ? ? ? ? ? // 線程啟動
? ? ? ? ? ? ? ? new Thread(client).start();
? ? ? ? ? ? ? ? // 將當(dāng)前啟動的客戶端保存下來
? ? ? ? ? ? ? ? clients.add(client);
? ? ? ? ? ? ? ? System.out.println("new Client成功!");
? ? ? ? ? ? ? ? System.out.println("A Client connected!");


? ? ? ? ? ? }

? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? serverSocket.close();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }

? ? /**
? ? ?*?
? ? ?*?
? ? ?*
? ? ?*/
? ? class Client implements Runnable {
? ? ? ? private Socket s;
? ? ? ? private DataInputStream dis = null;
? ? ? ? private boolean bConnected = false;
? ? ? ? private DataOutputStream dos;

? ? ? ? public Client(Socket s) {
? ? ? ? ? ? this.s = s;

? ? ? ? ? ? try {
? ? ? ? ? ? ? ? dis = new DataInputStream(s.getInputStream());
? ? ? ? ? ? ? ? dos = new DataOutputStream(s.getOutputStream());
? ? ? ? ? ? ? ? bConnected = true;
? ? ? ? ? ? ? ? System.out.println("有一個新的客戶端程序在運行");
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? // 一個客戶端連接成功以后,一直在執(zhí)行該while部分的代碼,其他客戶端無法連接
? ? ? ? ? ? /**
? ? ? ? ? ? ?* 解決方法: 1.異步解決方法:一直監(jiān)聽接收,其他在另外的地方執(zhí)行 2.使用單獨的線程: 線程:接受客戶端連接
? ? ? ? ? ? ?* 另外的單獨的線程:處理通訊
? ? ? ? ? ? ?*/

? ? ? ? }

? ? ? ? public void sendString(String str) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? dos.writeUTF(str);
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? clients.remove(this);
? ? ? ? ? ? ? ? System.out.println("對方退出了?。?!我從List中去掉了?。?!");
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? public void run() {
? ? ? ? ? ? Client client = null;
? ? ? ? ? ? // 注意這部分的包圍關(guān)系
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? while (bConnected) {
? ? ? ? ? ? ? ? ? ? String string = dis.readUTF();
? ? ? ? ? ? ? ? ? ? System.out.println(string);
? ? ? ? ? ? ? ? ? ? for (int i = 0; i < clients.size(); i++) {
? ? ? ? ? ? ? ? ? ? ? ? client = clients.get(i);
? ? ? ? ? ? ? ? ? ? ? ? client.sendString(string);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (EOFException e) {
? ? ? ? ? ? ? ? System.out.println("Client closed!");
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? System.exit(0);

? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? if (dis != null) {
? ? ? ? ? ? ? ? ? ? ? ? dis.close();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (s != null) {
? ? ? ? ? ? ? ? ? ? ? ? s.close();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }

? ? ? ? }

? ? }
}

客戶端代碼:

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
?* 可以和ChatServer版本三配套使用
?*?
?* @author Administrator
?*
?*/
public class ChatClientEdition3 extends Frame {
? ? TextField tfText = new TextField();
? ? TextArea taContent = new TextArea();
? ? Socket socket = null;
? ? DataOutputStream dataOutputStream = null;
? ? DataInputStream dataInputStream = null;
? ? private boolean bConnected = false;

? ? public static void main(String[] args) {

? ? ? ? new ChatClientEdition3().launchFrame();
? ? }

? ? // 加載窗口
? ? public void launchFrame() {
? ? ? ? setLocation(400, 300);
? ? ? ? this.setSize(300, 300);
? ? ? ? this.setTitle("在線聊天時--Quiana");
? ? ? ? add(tfText, BorderLayout.SOUTH);
? ? ? ? add(taContent, BorderLayout.NORTH);
? ? ? ? pack();
? ? ? ? // 窗口關(guān)閉的時間監(jiān)聽
? ? ? ? this.addWindowListener(new WindowAdapter() {

? ? ? ? ? ? @Override
? ? ? ? ? ? public void windowClosing(WindowEvent e) {
? ? ? ? ? ? ? ? disconnect();
? ? ? ? ? ? ? ? System.exit(0);
? ? ? ? ? ? }

? ? ? ? });
? ? ? ? tfText.addActionListener(new TFListener());
? ? ? ? this.setVisible(true);
? ? ? ? connect();
? ? ? ? new Thread(new RecvThread()).start();
? ? }

? ? // 文字處理的時間監(jiān)聽
? ? private class TFListener implements ActionListener {
? ? ? ? // 敲擊回車時,文字的變化事件
? ? ? ? @Override
? ? ? ? public void actionPerformed(ActionEvent arg0) {
? ? ? ? ? ? String s = tfText.getText().trim(); // 去掉兩端的空格
? ? ? ? ? ? tfText.setText("");
? ? ? ? ? ? try {

? ? ? ? ? ? ? ? dataOutputStream.writeUTF(s);
? ? ? ? ? ? ? ? dataOutputStream.flush();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? // 連接到服務(wù)器
? ? public void connect() {
? ? ? ? try {
? ? ? ? ? ? // 連接到服務(wù)器
? ? ? ? ? ? socket = new Socket("127.0.0.1", 8888);
? ? ? ? ? ? bConnected = true;
? ? ? ? ? ? dataOutputStream = new DataOutputStream(socket.getOutputStream());
? ? ? ? ? ? dataInputStream = new DataInputStream(socket.getInputStream());
? ? ? ? ? ? System.out.println("連接到服務(wù)器?。?!");
? ? ? ? } catch (BindException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (UnknownHostException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }

? ? // 斷開連接
? ? public void disconnect() {
? ? ? ? try {
? ? ? ? ? ? dataOutputStream.close();
? ? ? ? ? ? System.out.println("dataOutputStream成功關(guān)閉");
? ? ? ? ? ? socket.close();
? ? ? ? ? ? System.out.println("客戶端socket成功關(guān)閉");
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }

? ? private class RecvThread implements Runnable {

? ? ? ? public void run() {

? ? ? ? ? ? try {
? ? ? ? ? ? ? ? while (bConnected) {
? ? ? ? ? ? ? ? ? ? String string = dataInputStream.readUTF();
? ? ? ? ? ? ? ? ? ? if (taContent.getText().length() == 0) {
? ? ? ? ? ? ? ? ? ? ? ? taContent.setText(string);
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? taContent.setText(taContent.getText() + "\n" + string);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (SocketException e) {
? ? ? ? ? ? ? ? System.out.println("退出了,拜拜!");
? ? ? ? ? ? } catch (EOFException e) {
? ? ? ? ? ? ? ? System.out.println("退出了,拜拜!");
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }

? ? ? ? }

? ? }

}

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

相關(guān)文章

  • SpringBoot使用自定義注解實現(xiàn)數(shù)據(jù)脫敏過程詳細解析

    SpringBoot使用自定義注解實現(xiàn)數(shù)據(jù)脫敏過程詳細解析

    這篇文章主要介紹了SpringBoot自定義注解之脫敏注解詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java Exchanger并發(fā)類使用方法

    Java Exchanger并發(fā)類使用方法

    這篇文章主要介紹了Java Exchanger并發(fā)類使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot增量/瘦身部署jar包的方式

    SpringBoot增量/瘦身部署jar包的方式

    SpringBoot 項目的部署一般采用全量jar 包方式部署相關(guān)項目,如果我們對相關(guān)的Contrller層進行相關(guān)業(yè)務(wù)調(diào)整就需要重新編譯全量jar 包太麻煩了,所以本文給大家介紹了使用SpringBoot 的增量/瘦身部署方式,需要的朋友可以參考下
    2024-01-01
  • SpringBoot項目中配置application.yml中server.port不生效的問題

    SpringBoot項目中配置application.yml中server.port不生效的問題

    這篇文章主要介紹了SpringBoot項目中配置application.yml中server.port不生效的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MyBatis?的?XML?配置文件和緩存使用步驟

    MyBatis?的?XML?配置文件和緩存使用步驟

    MyBatis?包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定制,這篇文章主要介紹了MyBatis的XML配置文件和緩存,需要的朋友可以參考下
    2022-01-01
  • springboot結(jié)合maven實現(xiàn)多模塊打包

    springboot結(jié)合maven實現(xiàn)多模塊打包

    本文主要介紹了springboot借助maven完成多模塊打包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java中的HashMap弱引用之WeakHashMap詳解

    Java中的HashMap弱引用之WeakHashMap詳解

    這篇文章主要介紹了Java中的HashMap弱引用之WeakHashMap詳解,當(dāng)內(nèi)存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內(nèi)存不足的問題,需要的朋友可以參考下
    2023-09-09
  • MybatisPlus實現(xiàn)真正批量插入的詳細步驟

    MybatisPlus實現(xiàn)真正批量插入的詳細步驟

    在數(shù)據(jù)庫操作中,批量插入是提升效率的重要手段,MyBatis-Plus提供了多種批量插入方法,但默認的saveBatch方法效率并不高,文章介紹了通過手動拼接SQL、使用IService接口以及自定義insertBatchSomeColumn方法進行優(yōu)化,以實現(xiàn)更高效的批量插入,并給出了性能優(yōu)化建議
    2024-10-10
  • SpringBoot項目速度提升之延遲初始化(Lazy Initialization)詳解

    SpringBoot項目速度提升之延遲初始化(Lazy Initialization)詳解

    延遲初始化(Lazy?Initialization)是一種在需要時才創(chuàng)建或加載對象的策略,以減少啟動時間和資源消耗,本文就來講講延遲初始化的具體使用吧
    2023-05-05
  • Spring?Security權(quán)限注解啟動及邏輯處理使用示例

    Spring?Security權(quán)限注解啟動及邏輯處理使用示例

    這篇文章主要為大家介紹了Spring?Security權(quán)限注解啟動及邏輯處理使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論

双流县| 宁乡县| 安泽县| 苍溪县| 房产| 石楼县| 平潭县| 通许县| 罗田县| 商丘市| 靖安县| 登封市| 枣强县| 南溪县| 普宁市| 吉林省| 琼结县| 桦甸市| 三穗县| 禄劝| 濮阳县| 襄垣县| 浦县| 大城县| 新丰县| 固安县| 南靖县| 交城县| 郑州市| 曲水县| 永修县| 中西区| 郧西县| 大方县| 专栏| 偃师市| 柞水县| 上高县| 郁南县| 叶城县| 彭水|