生活随笔
收集整理的這篇文章主要介紹了
【Java线程】线程协作实现多对多聊天
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有關線程協作的具體問題,請查看本人其他博客,鏈接如下:
http://blog.csdn.net/lmb55/article/details/46274165
一對多聊天(一臺服務器對多臺客戶機):
原理圖:
多對多聊天:(相當于群聊,客戶端對客戶端)
實現一(服務器端):
原理:
服務器端有多個socket,各socket對間不是獨立的,從一個socket接受的信息,需要轉發到其他的socket上去。將構建的所有的socket放到一個數組中,當需要將一個客戶機發送的消息顯示給其它的客戶機時就遍歷該數組,創建輸出流,將消息發送出去。
原理圖如下:
實現二(服務器端)【改進】:
原理:
服務器端有多個socket,各socket對間也不是獨立的,每個socket中都有一個服務器接收線程和一個服務器發送線程,作用如下:
服務器接收線程:接收客戶端發送線程發來的請求,并將其發送過來的消息寫入到公共區域;喚醒服務器端發送線程;
服務器發送線程:當服務器端發送線程被喚醒之后,將需要寫入公共區域的內容發送給客戶端接收線程;
原理圖如下:
具體實現:
服務器端代碼如下:
MyChatServer.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
class MySend extends Thread{private Socket skt;
public MySend(Socket skt){
this.skt=skt;}
public void run(){
try {PrintWriter pw=
new PrintWriter(skt.getOutputStream());
for (;;) {synchronized (
"a") {
"a".wait();pw.println(MyChatServer.g_buf);pw.flush();}}}
catch (IOException e) {e.printStackTrace();}
catch (InterruptedException e) {e.printStackTrace();}}
}
class MyRecv extends Thread{private Socket skt;
public MyRecv(Socket skt){
this.skt=skt;}
public void run(){
try {BufferedReader br=
new BufferedReader(
new InputStreamReader(skt.getInputStream()));PrintWriter pw=
new PrintWriter(skt.getOutputStream());
for (;;) {String s=br.readLine();
if (s==
null)
break;synchronized (
"a") {MyChatServer.g_buf=s;
"a".notifyAll();}}}
catch (Exception e) {e.printStackTrace();}}
}
public class MyChatServer {public static String g_buf;
public static void main(String[] args) throws Exception{System.out.println(
"ChatServer v1.0");ServerSocket sskt=
new ServerSocket(
9999);
for (;;) {Socket skt=sskt.accept();
new MySend(skt).start();
new MyRecv(skt).start();}}}
可使用本人之前實現的一對一聊天中的客戶端來與本例中的服務器端進行通話,鏈接如下:
http://blog.csdn.net/lmb55/article/details/46240305
總結
以上是生活随笔為你收集整理的【Java线程】线程协作实现多对多聊天的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。