生活随笔
收集整理的這篇文章主要介紹了
【Java线程】线程协作实现多对多聊天
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有關(guān)線程協(xié)作的具體問題,請(qǐng)查看本人其他博客,鏈接如下:
http://blog.csdn.net/lmb55/article/details/46274165
一對(duì)多聊天(一臺(tái)服務(wù)器對(duì)多臺(tái)客戶機(jī)):
原理圖:
多對(duì)多聊天:(相當(dāng)于群聊,客戶端對(duì)客戶端)
實(shí)現(xiàn)一(服務(wù)器端):
原理:
服務(wù)器端有多個(gè)socket,各socket對(duì)間不是獨(dú)立的,從一個(gè)socket接受的信息,需要轉(zhuǎn)發(fā)到其他的socket上去。將構(gòu)建的所有的socket放到一個(gè)數(shù)組中,當(dāng)需要將一個(gè)客戶機(jī)發(fā)送的消息顯示給其它的客戶機(jī)時(shí)就遍歷該數(shù)組,創(chuàng)建輸出流,將消息發(fā)送出去。
原理圖如下:
實(shí)現(xiàn)二(服務(wù)器端)【改進(jìn)】:
原理:
服務(wù)器端有多個(gè)socket,各socket對(duì)間也不是獨(dú)立的,每個(gè)socket中都有一個(gè)服務(wù)器接收線程和一個(gè)服務(wù)器發(fā)送線程,作用如下:
服務(wù)器接收線程:接收客戶端發(fā)送線程發(fā)來的請(qǐng)求,并將其發(fā)送過來的消息寫入到公共區(qū)域;喚醒服務(wù)器端發(fā)送線程;
服務(wù)器發(fā)送線程:當(dāng)服務(wù)器端發(fā)送線程被喚醒之后,將需要寫入公共區(qū)域的內(nèi)容發(fā)送給客戶端接收線程;
原理圖如下:
具體實(shí)現(xiàn):
服務(wù)器端代碼如下:
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();}}}
可使用本人之前實(shí)現(xiàn)的一對(duì)一聊天中的客戶端來與本例中的服務(wù)器端進(jìn)行通話,鏈接如下:
http://blog.csdn.net/lmb55/article/details/46240305
總結(jié)
以上是生活随笔為你收集整理的【Java线程】线程协作实现多对多聊天的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。