Java編寫實(shí)現(xiàn)多人聊天室
本文實(shí)例為大家分享了Java實(shí)現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下
1.客戶端
package tk.javazhangwei.net.tcp.chat.Demo03;
?
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
?
/***
?* 創(chuàng)建客戶端 ?發(fā)送數(shù)據(jù)+接收數(shù)據(jù)
?*?
?* @author zw
?*
?*/
public class Client {
?? ?public static void main(String[] args) throws IOException {
?? ??? ?BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
?? ??? ?System.out.println("請(qǐng)輸入一個(gè)喜歡的名稱:");
?? ??? ?String name = bf.readLine();
?? ??? ?if(name.equals("")) {
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?
?? ??? ?Socket client = new Socket("localhost",1025);
?? ??? ?//控制臺(tái)輸入信息
?? ??? ?//控制臺(tái)輸入信息
?? ??? ?new Thread(new Send(client,name)).start();//一條路徑
?? ??? ?new Thread(new Receive(client)).start();//一條路徑
}
}2.服務(wù)端(寫了個(gè)內(nèi)部類:負(fù)責(zé)接收與發(fā)送多進(jìn)程)
package tk.javazhangwei.net.tcp.chat.Demo03;
?
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
?
public class Server {
?? ?List<myChannel> all = new ArrayList<myChannel>();
?? ?
?? ?
?? ?
?? ?public static void main(String[] args) throws IOException {
?? ??? ?new Server().start();
?? ??? ?
?
?? ?}
?? ?
?? ?
?? ?public void start() throws IOException {
?? ??? ?ServerSocket server = new ServerSocket(1025);
?? ??? ?while (true) {
?? ??? ??? ?Socket socket = server.accept();
?? ??? ??? ?myChannel mc = new myChannel(socket);
?? ??? ??? ?Thread t = new Thread(mc);
?? ??? ??? ?all.add(mc);
?? ??? ??? ?t.start();
?? ?}
}
?
?
/***
?* 一個(gè)客戶端 一個(gè)通路
?* @author zw
?*
?*/
class myChannel implements Runnable{
?? ?private DataInputStream dis;
?? ?private DataOutputStream dos;
?? ?private boolean isRuning=true;
?? ?private String name;
?? ?
?? ?public myChannel(Socket socket) throws IOException{
?? ??? ?try {
?? ??? ??? ?dis = new DataInputStream(socket.getInputStream());
?? ??? ??? ?dos = new DataOutputStream(socket.getOutputStream());
?? ??? ??? ?this.name = dis.readUTF();
?? ??? ??? ?send("歡迎進(jìn)入聊天室");
?? ??? ??? ?senOthers(this.name + "進(jìn)入了聊天室");
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?//e.printStackTrace();
?? ??? ??? ??? ?isRuning=false;
?? ??? ??? ??? ?dos.close();
?? ??? ??? ??? ?dis.close();
?? ??? ??? ??? ?
?? ??? ?}
?? ??? ?
?? ?}
?? ?/***
?? ? * 讀取數(shù)據(jù)
?? ? *?
?? ? * @return
?? ? * @throws IOException
?? ? */
?? ?private String receive() throws IOException {
?? ??? ?String msg ="";
?? ??? ?try {
?? ??? ??? ?msg =dis.readUTF();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?//e.printStackTrace();
?? ??? ??? ?isRuning=false;
?? ??? ??? ?dis.close();
?? ??? ?
?? ??? ?}
?? ??? ?
?? ??? ?
?? ??? ?return msg;?? ?
?? ?}
?? ?/***
?? ? * 發(fā)送數(shù)據(jù)
?? ? * @throws IOException?
?? ? */
?? ?private void send(String msg) throws IOException {
?? ??? ?if(msg==null&& msg.equals("")) {
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?try {
?? ??? ??? ?dos.writeUTF(msg);
?? ??? ??? ?dos.flush();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?//e.printStackTrace();
?? ??? ??? ?isRuning=false;
?? ??? ??? ?dos.close();
?? ??? ??? ?all.remove(this);
?? ??? ?}
?? ??? ?
?? ?}
?? ?/***
?? ? * 發(fā)送給其他客戶端
?? ? * @throws IOException?
?? ? */
?? ?private void senOthers(String msg) throws IOException {
?? ??? ?if (msg.startsWith("@")&&msg.indexOf(":")>-1) {// 表示為私聊
?? ??? ??? ?//獲取name
?? ??? ??? ?String name = msg.substring(1, msg.indexOf(":"));
?? ??? ??? ?String content = msg.substring(msg.indexOf(":")+1);//獲取冒號(hào)后的正文
?? ??? ??? ?for (myChannel others : all) {
?? ??? ??? ??? ?if(others.name.equals(name)) {
?? ??? ??? ??? ??? ?others.send(this.name+"對(duì)您瞧瞧的說:"+content);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?
?? ??? ?} else {
?? ??? ?//遍歷容器
?? ??? ?for(myChannel others:all) {
?? ??? ??? ?if(others == this) {//如果是本身,就跳過
?? ??? ??? ??? ?continue;
?? ??? ??? ?}
?? ??? ??? ?others.send(this.name+"對(duì)所有人說:"+msg);
?? ??? ?}
?? ??? ?}
?? ?}
?? ?
?? ?@Override
?? ?public void run() {
?? ??? ?while(isRuning) {
?? ??? ??? ?try {
?? ??? ??? ??? ?senOthers(receive()) ;
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ??? ?}
}
}3.客戶端的發(fā)送與接收多進(jìn)程
package tk.javazhangwei.net.tcp.chat.Demo03;
?
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
?
/***
?* 發(fā)送數(shù)據(jù)
?*?
?* @author zw
?*
?*/
public class Send implements Runnable{
?? ?//控制臺(tái)輸入流
?? ?private BufferedReader console;
?? ?//管道輸出流
?? ?private DataOutputStream dos;
?? ?private String name;
?? ?
?? ?private boolean isRuning =true;//線程是否運(yùn)行
?? ?
?? ?public Send() {
?? ??? ?console =new BufferedReader(new InputStreamReader(System.in));
?? ?}
?? ?
?? ?public Send(Socket client,String name) throws IOException {
?? ??? ?this();
?? ??? ?try {
?? ??? ??? ?dos = new DataOutputStream(client.getOutputStream());
?? ??? ??? ?this.name = name;
?? ??? ??? ?send(name);
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?//e.printStackTrace();
?? ??? ??? ? isRuning =false;
?? ??? ??? ? dos.close();
?? ??? ??? ? console.close();
?? ??? ?}
?? ?}
?? ?private String getMsgFromConsole() {
?? ??? ?try {
?? ??? ??? ?return console.readLine();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ??? ?return "";
?? ?}
?
?? ?
@Override
?? ?public void run() {
?? ??? ?
?? ??? ?while(isRuning) {
?? ??? ??? ?try {
?? ??? ??? ??? ?send(getMsgFromConsole());
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ?}
?? ?}
?
?? ?public void send(String msg) throws IOException {
?? ??? ?if (msg!=null && !msg.equals("")) {
?? ??? ??? ?try {
?? ??? ??? ??? ?dos.writeUTF(msg);
?? ??? ??? ??? ?dos.flush();// 強(qiáng)制刷新
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?// e.printStackTrace();
?? ??? ??? ??? ?isRuning = false;
?? ??? ??? ??? ?dos.close();
?? ??? ??? ??? ?console.close();
?
?? ??? ??? ?}
?? ??? ?}
?? ?}
?
}package tk.javazhangwei.net.tcp.chat.Demo03;
?
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
?
/***
?* 接收數(shù)據(jù)
?* @author zw
?*
?*/
public class Receive implements Runnable{
?? ?//客戶端的輸入流
?? ?private DataInputStream dis;
?? ?private boolean isRuning = true;
?? ?
?? ?public Receive() {
?? ?
?? ?}
?
?? ?public Receive(Socket client) {
?? ??? ?super();
?? ??? ?try {
?? ??? ??? ?dis = new DataInputStream(client.getInputStream());
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?//e.printStackTrace();
?? ??? ??? ?isRuning =false;
?? ??? ??? ?try {
?? ??? ??? ??? ?dis.close();
?? ??? ??? ?} catch (IOException e1) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e1.printStackTrace();
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?/***
?? ? * 接收數(shù)據(jù)
?? ? * @return
?? ? * @throws IOException?
?? ? */
?? ?public String receive() throws IOException {
?? ??? ?String msg = "";
?? ??? ?try {
?? ??? ??? ?msg =dis.readUTF();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ??? ?isRuning =false;
?? ??? ??? ?dis.close();
?? ??? ?}
?? ??? ?
?? ??? ?return msg;
?? ?}
?? ?@Override
?? ?public void run() {
?? ??? ?while(isRuning) {
?? ??? ??? ?try {
?? ??? ??? ??? ?System.out.println(receive());
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ?}
?? ??? ?
?? ?}
?
}4.效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁聊天室實(shí)例代碼
- java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能
- java聊天室的實(shí)現(xiàn)代碼
- Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例
- java實(shí)現(xiàn)一個(gè)簡(jiǎn)單TCPSocket聊天室功能分享
- 基于java編寫局域網(wǎng)多人聊天室
- Java Socket聊天室編程(一)之利用socket實(shí)現(xiàn)聊天之消息推送
- Java基于UDP協(xié)議實(shí)現(xiàn)簡(jiǎn)單的聊天室程序
- Java Socket聊天室編程(二)之利用socket實(shí)現(xiàn)單聊聊天室
- 使用java基于pushlet和bootstrap實(shí)現(xiàn)的簡(jiǎn)單聊天室
相關(guān)文章
超級(jí)好用的輕量級(jí)JSON處理命令jq(最新推薦)
jq是一個(gè)輕量級(jí)的命令行工具,讓你可以非常方便地處理JSON數(shù)據(jù),如切分、過濾、映射、轉(zhuǎn)化等,就像sed、awk、grep文本處理三劍客一樣,這篇文章主要介紹了超級(jí)好用的輕量級(jí)JSON處理命令jq,需要的朋友可以參考下2023-01-01
java中Sources目錄Resources目錄的區(qū)別解讀
這篇文章主要介紹了java中Sources目錄Resources目錄的區(qū)別解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Mybatis通用Mapper(tk.mybatis)的使用
本文主要介紹了Mybatis通用Mapper(tk.mybatis)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Idea入門教程之一分鐘創(chuàng)建一個(gè)Java工程
idea作為Java開發(fā)最好用的編寫代碼軟件之一,首先進(jìn)行的就是工程的創(chuàng)建,這篇文章主要給大家介紹了關(guān)于Idea入門教程之一分鐘創(chuàng)建一個(gè)Java工程的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
16個(gè)SpringBoot擴(kuò)展接口的總結(jié)和實(shí)例
Spring Boot是一個(gè)開源的Java框架,它簡(jiǎn)化了基于Spring的應(yīng)用程序的開發(fā)和部署,它提供了許多強(qiáng)大的特性和擴(kuò)展接口,本文給大家介紹了16個(gè)常用的Spring Boot擴(kuò)展接口,需要的朋友可以參考下2023-09-09
SpringMVC異步處理操作(Callable和DeferredResult)
這篇文章主要介紹了SpringMVC異步處理操作(Callable和DeferredResult),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01

