生活随笔
收集整理的這篇文章主要介紹了
基于UDP/IP协议的聊天室
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
基于TCP/IP通信協(xié)議的聊天室
概述:
- 基于TCP/IP通信協(xié)議的聊天室是通過服務(wù)端/客戶端的模式進(jìn)行的,必須是服務(wù)端開啟之后,客戶端通過獲取服務(wù)端的ip和端口號并連接之后才能進(jìn)行信息的共享,具體的實現(xiàn)過程代碼如下:
package cs聊天室;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 服務(wù)端* @author 黃小寶**/
public class MyServer {//定義一個集合用來存儲所有連接到服務(wù)器的客戶端socket,并將其包裝成線程安全的static volatile List<Socket> socketList = new ArrayList<>();public static void main(String[] args) throws IOException {//創(chuàng)建一個服務(wù)器ServerSocket server=new ServerSocket(9999);System.out.println("服務(wù)器已創(chuàng)建,等待連接.......");while(true) {//開始監(jiān)視,這個時候,如果沒有客戶端連接,這里會被一直阻塞Socket s=server.accept();System.out.println(s.getInetAddress().getHostName()+"連接成功");socketList.add(s);//每當(dāng)一個客戶端連接后,就開啟一個線程為該客戶服務(wù)new ServerThread(s).start();}}
}
- 這個是服務(wù)端,即服務(wù)器,里面定義了端口號,因為是本機(jī),所以在創(chuàng)建ServerSocket對象時,沒有添加ip地址,這個類的作用是創(chuàng)建一個服務(wù)器并開啟服務(wù)器,將開啟過程放在while循環(huán)里面,可以無限的接收來自客戶端的連接,并為每一個連接到服務(wù)器的客戶端創(chuàng)建一個線程。
package cs聊天室;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;/*** 服務(wù)端線程, 他負(fù)責(zé)為每一個客戶端提供線程服務(wù)* @author 黃小寶**/
public class ServerThread extends Thread {//定義當(dāng)前線程需要處理的socketprivate Socket s;public ServerThread(Socket s) {super();this.s = s;}@Overridepublic void run() {//采用循環(huán)不斷的讀取從socket發(fā)過來的信息try {System.out.println("歡迎使用!!!");BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));String content = null;while((content=br.readLine())!=null){//遍歷集合中的每一個socket,將讀到的類容給每個socket都發(fā)一次for(Socket s:MyServer.socketList) {PrintStream ps=new PrintStream(s.getOutputStream());ps.println(content);}}} catch (IOException e) {e.printStackTrace();}}}
- 這個類是一個線程類,是服務(wù)器用來處理來自每一個客戶端訪問的線程,他可以實現(xiàn)將所有客戶端發(fā)送的消息全部發(fā)送給每一個其他的客戶端,達(dá)到群聊里面每一個客戶端都能夠看到所發(fā)的消息
package cs聊天室;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
/*** 客戶端* @author 黃小寶**/
public class MyClient {public spackage cs聊天室;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
/*** 客戶端* @author 黃小寶**/
public class MyClient {public static void main(String[] args) throws UnknownHostException, IOException {//創(chuàng)建客戶端Socket s= new Socket("192.168.7.141",8888);//啟動線程,不斷的讀取來自服務(wù)器的數(shù)據(jù)new ClientThread(s).start();//獲取socket對應(yīng)的輸出流PrintStream ps=new PrintStream(s.getOutputStream());String line=null;//不斷的讀取鍵盤輸入BufferedReader br=new BufferedReader(new InputStreamReader(System.in));while((line=br.readLine())!=null) {//將用戶的鍵盤輸入類容寫入socket對應(yīng)的輸出流ps.println(line);}}
}
tatic void main(String[] args) throws UnknownHostException, IOException {//創(chuàng)建客戶端Socket s= new Socket("192.168.7.141",8888);//啟動線程,不斷的讀取來自服務(wù)器的數(shù)據(jù)new ClientThread(s).start();//獲取socket對應(yīng)的輸出流PrintStream ps=new PrintStream(s.getOutputStream());String line=null;//不斷的讀取鍵盤輸入BufferedReader br=new BufferedReader(new InputStreamReader(System.in));while((line=br.readLine())!=null) {//將用戶的鍵盤輸入類容寫入socket對應(yīng)的輸出流ps.println(line);}}
}
- 這是客戶端,可以通過建立Socket對象來連接到服務(wù)器,因為每一個客戶端都需要接收來自服務(wù)器發(fā)送的消息,所以這里要再創(chuàng)建一個客戶端的線程用來無限的接收來自服務(wù)器的消息
package cs聊天室;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;/*** 客戶端線程* @author 黃小寶**/
public class ClientThread extends Thread {//該線程負(fù)責(zé)處理的socketprivate Socket s;public ClientThread(Socket s) {this.s = s;}@Overridepublic void run() {String content = null;//不斷的讀取socket輸入流中的內(nèi)容,并將這些內(nèi)容打印出來try {BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));while((content=br.readLine())!=null) {System.out.println(content);}} catch (IOException e) {e.printStackTrace();}}}
- 到這里所有的代碼已經(jīng)寫完了,接下來就是測試的環(huán)節(jié):首先需要開啟服務(wù)器,注意,必須先要開啟服務(wù)器,然后客戶端才可以連接:
打開服務(wù)器之后 :
服務(wù)器已創(chuàng)建,等待連接.......
打開客戶端之后:
服務(wù)器已創(chuàng)建,等待連接.......
DESKTOP-HPFJ5AE連接成功
歡迎使用!!!
然后就可以使用多個客戶端連接到服務(wù)器,在控制臺輸入消息,每個客戶端都能看到各自發(fā)的消息了!
總結(jié)
以上是生活随笔為你收集整理的基于UDP/IP协议的聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。