日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

聊天系统服务器端类图,使用Java多线程来实现多人聊天室 附实例代码

發(fā)布時(shí)間:2023/12/18 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊天系统服务器端类图,使用Java多线程来实现多人聊天室 附实例代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

群聊天就是一個(gè)比較典型的多人聊天平臺(tái),我們總會(huì)拉幾個(gè)朋友、或是同學(xué)、同事建立一個(gè)群聊,在里面聊聊天、討論學(xué)習(xí)工作等等。那么多人聊天具體是怎么實(shí)現(xiàn)的呢?下面,將通過Java的多線程來實(shí)現(xiàn)多人聊天室的效果。

1.前言

程序?qū)崿F(xiàn)基于星型結(jié)構(gòu)(服務(wù)器接收來自各個(gè)客戶端發(fā)送的信息,然后將信息傳遞給其他客戶端界面并在其他客戶端界面顯示發(fā)送的信息)

2.類圖

3.代碼

客戶端代碼:

package netProgram;

import java.io.IOException;

import java.net.Socket;

import java.net.SocketAddress;

public class Client implements ScreenInputInterface{

private SocketHandler socketHandler;

public void start(){

new Thread(new ScreenInputRunIns(this)).start();

try {

socketHandler = new SocketHandler(new Socket("127.0.0.1",666),null);

new Thread(socketHandler).start();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void send(String msg) {

socketHandler.sendMsg(msg);

}

/* @Override

public void send(String msg, SocketAddress address) {

socketHandler.sendMsg(msg);

}*/

}

服務(wù)端代碼:

package netProgram;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.SocketAddress;

import java.util.ArrayList;

import java.util.List;

public class Server implements ScreenInputInterface{

private List clients = new ArrayList<>();

private ServerSocket serverSocket;

public void start(){

// new Thread(new ScreenInputRunIns(this)).start();

try {

serverSocket = new ServerSocket(666);

while (true){

SocketHandler socketHandler = new SocketHandler(serverSocket.accept(),this);

clients.add(socketHandler);

System.out.println(socketHandler.getSocket().getRemoteSocketAddress()+"進(jìn)入聊天系統(tǒng)");

new Thread(socketHandler).start();

}

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void send(String msg) {

for (SocketHandler s:clients) {

s.sendMsg(msg);

}

}

/* @Override

public void send(String msg, SocketAddress address) {

for (SocketHandler s:clients) {

if (s.getSocket().getRemoteSocketAddress().equals(address)){

continue;

}

s.sendMsg(msg);

}

}*/

public static void main(String[] args) {

new Server().start();

}

}

屏幕輸入信息接口:

package netProgram;

import java.net.SocketAddress;

public interface ScreenInputInterface {

void send(String msg);

// void send(String msg, SocketAddress address);

}

用于各個(gè)端口輸入信息的創(chuàng)建的線程對(duì)象:

package netProgram;

import java.util.Scanner;

public class ScreenInputRunIns implements Runnable{

private ScreenInputInterface screenInputInterface;

private Scanner input = new Scanner(System.in);

public ScreenInputRunIns(ScreenInputInterface screenInputInterface) {

this.screenInputInterface = screenInputInterface;

}

@Override

public void run() {//屏幕實(shí)時(shí)輸入

while (true){

String msg = input.nextLine();

// screenInputInterface.send(msg,null);

screenInputInterface.send(msg);

}

}

}

套接字處理器(用于傳輸數(shù)據(jù):實(shí)際發(fā)送信息到輸出流并實(shí)時(shí)監(jiān)聽各個(gè)端口的輸入且負(fù)責(zé)顯示):

package netProgram;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

public class SocketHandler implements Runnable{

private String clientName;

private Socket socket;

private PrintWriter writer;

private Server server;

public SocketHandler(Socket socket,Server server) throws IOException {

this.socket = socket;

this.server = server;

clientName = "";

writer = new PrintWriter(this.socket.getOutputStream());

}

public Socket getSocket() {

return socket;

}

public void sendMsg(String msg){

if (server!=null) writer.println(msg);

else writer.println(clientName+":"+msg);

writer.flush();

}

@Override

public void run() {

while(true){//監(jiān)聽輸入流的輸入

try {

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String receiveMsg = null;

System.out.println();

if ((receiveMsg = reader.readLine())!=null&&!(receiveMsg.equals(""))){

if (server!=null){

// server.send(receiveMsg,socket.getRemoteSocketAddress());

server.send(receiveMsg);

}else {

System.out.println(receiveMsg);

}

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

負(fù)責(zé)啟動(dòng)的各個(gè)端口的客戶端代碼:

package netProgram;

public class ClientLinked {

public static void main(String[] args) {

new Client().start();

}

}

package netProgram;

public class ClientLinked1 {

public static void main(String[] args) {

new Client().start();

}

}

package netProgram;

public class ClientLinked2 {

public static void main(String[] args) {

new Client().start();

}

}

服務(wù)端啟動(dòng)代碼在服務(wù)端類的main方法中。

到此本篇關(guān)于使用Java多線程來實(shí)現(xiàn)多人聊天室的文章就介紹結(jié)束了,想要了解更多相關(guān)java多線程的其他應(yīng)用內(nèi)容,請(qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章。希望本篇文章能夠幫助大家對(duì)于Java多線程的理解,也希望大家以后多多支持!

總結(jié)

以上是生活随笔為你收集整理的聊天系统服务器端类图,使用Java多线程来实现多人聊天室 附实例代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。