Java建立 多人聊天室
先執行伺服器端再執行客戶端
//這是客戶端
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.*;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Client {
private Scanner scanner=null;
private Socket socket=null;
private String s="";
public Client() {
try {
System.out.println("客戶端啟動");
socket=new Socket("localhost",8051);
System.out.println("客戶端已啟動");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void start() {
try {
ServerClient serverclient=new ServerClient();
Thread t=new Thread(serverclient);
t.start();
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");
BufferedWriter bw=new BufferedWriter(osw);
PrintWriter pw=new PrintWriter(bw,true);
scanner=new Scanner(System.in);
while(true) {
s=scanner.nextLine();
if(s.equals("over")) break;
pw.println(s);
}
}catch(SocketException e) {
System.out.println("無內容");
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Client c=new Client();
c.start();
}
/*
* 定義一個內部類進行內部的訊息處理
*/
class ServerClient implements Runnable{
public void run() {
try {
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(isr);
String s;
while((s=br.readLine())!=null) {
System.err.println(s);
}
}catch(SocketException e) {
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//這是伺服器端
public class Server1 {
private ServerSocket server=null;
private ClientServer clientserver=null;
private String s="";
public PrintWriter[] allout= {};
public Server1() {
try {
System.out.println("伺服器開始啟動");
server=new ServerSocket(8051);
System.out.println("伺服器已啟動");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 定義一個start方法進行對資訊接收及傳送的處理
*/
public void start() {
while(true) {
try {
System.out.println("--------------------------------");
System.err.println("伺服器準備接收");
Socket socket=server.accept();
System.err.println("伺服器開始接收");
System.out.println("---------------------------------");
clientserver=new ClientServer(socket);
Thread t=new Thread(clientserver);
t.start();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {
e.getStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Server1 s=new Server1();
s.start();
}
class ClientServer implements Runnable{
private Socket socket=null;
private String hostname="";
private String words=null;
public ClientServer(Socket socket) {
this.socket=socket;
this.hostname=socket.getInetAddress().getHostName();
}
@Override
public void run() {
InputStream is;
PrintWriter pw=null ;
try {
/*
* 獲得客戶端傳送過來的輸入流
*/
is = socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(isr);
/*
* 獲得伺服器要傳送到客戶端的輸出流
*/
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");
BufferedWriter bw=new BufferedWriter(osw);
pw=new PrintWriter(bw,true);
/*
* 這個同步程式碼塊時有新的執行緒時執行一次的
* 目的時將pw放入allout這個輸出流陣列中
*/
synchronized(allout) {
//陣列擴容
allout=Arrays.copyOf(allout,allout.length+1);
//將當前獲得的輸出流放入陣列中
allout[allout.length-1]=pw;
}
System.out.println(hostname+"上線了當前上線人數"+allout.length);
/*
*
*/
while((words=br.readLine())!="over") {
System.out.println(hostname+"<<"+words+";");
//遍歷客戶端陣列向所有客戶端傳送資訊
synchronized(allout) {
for(int begin=0;begin<allout.length;++begin) {
//除了自己向線上的所有人都傳送訊息
if(allout[begin]!=pw)
allout[begin].println(hostname+"<<"+words);
}
}
}
}catch(SocketException e) {
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//對已經退出的使用者| 資料流 |進行刪除
synchronized(allout) {
for(int i=0;i<allout.length;i++) {
if(allout[i]==pw) {
allout[i]=allout[allout.length-1];
allout=Arrays.copyOf(allout, allout.length-1);
break;
}
}
}
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(hostname+"下線了當前上線人數"+allout.length);
}
}
}
相關文章
- js程式碼實現多人聊天室JS
- Python+django網頁設計入門(20):使用WebSocket建立多人線上聊天室PythonDjango網頁Web
- Go語言專案實戰:多人聊天室Go
- Vue開發多人聊天室 覆盤總結Vue
- [練手專案]Gin+websocket 的多人聊天室Web
- Python基於Socket實現簡易多人聊天室Python
- Node + WebSocket + Vue 聊天室建立群聊/加入群聊WebVue
- Java聊天室——一對一模式Java模式
- 【Java學習】聊天室專案(32)Java
- JAVA通訊(三)——實現多人聊天Java
- 為什麼有許多人學java?Java
- 怎樣做好多人聊天室原始碼開發?注意功能機制的設定原始碼
- 基於Netty實現的WebSocket聊天室--支援多人同時線上及定時心跳檢測NettyWeb
- Java建立AnnotationJava
- java建立程式Java
- java小課設:使用MySQL做一個聊天室JavaMySql
- 用Java構建一個簡單的WebSocket聊天室JavaWeb
- Java實現多執行緒區域網聊天室Java執行緒
- netty建立聊天室服務端及單機併發測試結果Netty服務端
- Java物件建立模式Java物件模式
- erlang聊天室
- Java 14 都快來了,為什麼還有這麼多人固守Java 8?Java
- IDEA建立Java WEB工程IdeaJavaWeb
- java建立資料夾Java
- Java這個高階特性,很多人還沒用過!Java
- 用Java程式碼實現一個簡單的聊天室功能Java
- 重構 JAVA 聊天室 —— CS 模式的簡單架構實現Java模式架構
- Websocket 直播間聊天室教程 - GoEasy 快速實現聊天室WebGo
- java類的建立過程Java
- 使用java建立新的程序Java
- 詳解Java的物件建立Java物件
- java反射方式建立例項Java反射
- (Java)設計模式:建立型Java設計模式
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- 透過示例在 Unity 和 NodeJS 上的遊戲中建立安全、快速的多人遊戲UnityNodeJS遊戲
- git多人開發Git
- Java 中建立子類物件會建立父類物件麼?Java物件
- 實戰swoole【聊天室】