mysql集群是master-slaver模式,java程序當(dāng)然是鏈接master那臺(tái)機(jī)器了,slaver只是給master做輔助的。
成都創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計(jì),凌云網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:凌云等地區(qū)。凌云做網(wǎng)站價(jià)格咨詢:18982081108
直接用socket和servsocket開(kāi)發(fā)。命令行形式,改造成可視化的話,需要拆分功能。懶。
主要思路:
客戶端 連接到服務(wù) 獲取輸入輸出流。分別用2個(gè)線程處理輸入流和輸出流。
服務(wù)端 使用Set集合保存socket信息。同時(shí)使用線程安全Queue保存接收到的message。使用一個(gè)線程處理輸入流,并將接到的封裝成一個(gè)Message對(duì)象放到Queue中,對(duì)象保存連接的socket信息。另開(kāi)一個(gè)線程用于從Queue獲取消息,然后分發(fā)消息到Set中socket。
只是一個(gè)粗糙的即時(shí)聊天室。無(wú)緩沖功能。新用戶加入進(jìn)來(lái)不能獲取以前的消息。只能獲取加入后的其他人再發(fā)送的消息。
像這樣:服務(wù)端測(cè)試:message中socket標(biāo)識(shí)消息來(lái)源。
使用三個(gè)客戶端測(cè)試:
服務(wù)器 端 使用個(gè)鏈表把在線用戶賬號(hào)和他對(duì)應(yīng)的鏈接保存起來(lái)。例如 soket。
之后 定義一個(gè)協(xié)議,
在 客戶端發(fā)出來(lái)的 聊天信息前面添加一個(gè)頭。
例如,1表示群聊,2表示私聊,3表示添加好友,等等。每一個(gè)行為對(duì)應(yīng)一個(gè)編碼超過(guò)10個(gè)可以使用字母。
群聊的話,沒(méi)什么好說(shuō),每個(gè)人發(fā)一個(gè);
私聊,那么接下來(lái)的一個(gè)字符可以表示,私聊對(duì)象的賬戶名 的長(zhǎng)度,比如 tom的 長(zhǎng)度就是3,
之后,根據(jù)長(zhǎng)度,截取 第3到第5個(gè)字符,截取到 此次 私聊信息是發(fā)送給 tom 的。
這條發(fā)送給服務(wù)器,希望他轉(zhuǎn)發(fā)給tom的 消息就應(yīng)該是
"23tom你好!"
之后去鏈表里面找tom 的soket 鏈接。打開(kāi)他的 輸出流,給他傳送 聊天信息。
歡迎追問(wèn)。
一樓的思路是正確的,我給你代碼參考!
GroupChat_Server.java
--------------------------------------------------------------------------
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java點(diǎn)虐 .ServerSocket;
import java點(diǎn)虐 .Socket;
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class GroupChat_Server {
static DataOutputStream dataouts;
static int count = 0;
//創(chuàng)建一個(gè)集合類的數(shù)組,存放客戶端的對(duì)象
public static ArrayListSocket socketList = new ArrayListSocket();
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(3999);//開(kāi)設(shè)服務(wù)器端口3999
JOptionPane.showMessageDialog(null, "服務(wù)器啟動(dòng)成功");
while (true) {
Socket s = server.accept();//等待客戶端的連接
dataouts = new DataOutputStream(s.getOutputStream());
count++;
dataouts.writeUTF("Connection successful,Welcome! "+s.toString()+" The "+count+" Client.");
socketList.add(s);//把連接成功的Socket對(duì)象存進(jìn)數(shù)組
new Thread(new ServerThread(s)).start();//為每個(gè)客戶端創(chuàng)建一個(gè)進(jìn)程
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread implements Runnable {
Socket s = null;
DataInputStream datain = null;
public ServerThread(Socket s) {
this.s = s;
try {
datain = new DataInputStream(s.getInputStream());//獲取客戶端發(fā)來(lái)的數(shù)據(jù)
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
String content = null;
while ((content = readFromClient()) != null) {
for (Socket s : GroupChat_Server.socketList) {//遍歷數(shù)組
DataOutputStream dataout = new DataOutputStream(
s.getOutputStream());
dataout.writeUTF(content);
dataout.flush();//將緩沖區(qū)的數(shù)據(jù)全部輸出!
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String readFromClient() {//封裝客戶端發(fā)來(lái)的數(shù)據(jù)
try{
return datain.readUTF();
}catch(IOException e){
GroupChat_Server.socketList.remove(s);
}
return null;
}
}
--------------------------------------------------------------------------
GroupChat_Client.java
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java點(diǎn)虐 .BindException;
import java點(diǎn)虐 .Socket;
import java點(diǎn)虐 .SocketException;
@SuppressWarnings("serial")
public class GroupChat_Client extends JFrame {
JPanel p1, p2, p3, p4;
JTextArea Txt, SentTxt;
JTextField name;
JButton connection, submit, accept;
TitledBorder title, border;
JLabel conMessage;
DataOutputStream dataout;
DataInputStream datain;
ClientThread ct;
public GroupChat_Client() {
super("---Chat Client---");
setLayout(new BorderLayout());
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
Container frame = getContentPane();
Txt = new JTextArea(16, 50);
JScrollPane getText = new JScrollPane(Txt);
Txt.setEditable(false);
p1.add(getText);
SentTxt = new JTextArea(3, 36);
JScrollPane SentText = new JScrollPane(SentTxt);
connection = new JButton("Connection");
submit = new JButton(" Sent ");
p2.setLayout(new BorderLayout());
p2.add(connection, "West");
p4.setLayout(new FlowLayout(0));
p4.add(new JLabel("Message:"));
p4.add(SentText);
p2.add(p4);
p2.add(submit, "East");
p3.setLayout(new GridLayout(4, 1));
conMessage = new JLabel(
"htmlbodyp服務(wù)器還沒(méi)有啟動(dòng)!/p br p請(qǐng)啟動(dòng)服務(wù)器.../pbody/html",
0);
name = new JTextField();
name.setText("客戶端["+GroupChat_Server.count+"]");
p3.add(new JLabel(" 歡迎使用,請(qǐng)?jiān)O(shè)置呢稱: ", 0));
p3.add(name);
p3.add(conMessage);
p3.add(new JLabel(
"htmlbody--DESIGN BY:LiXiaoFei-- br --CopyRight 2012--body/html",
0));
title = new TitledBorder("消息框");
border = new TitledBorder("");
p1.setBorder(title);
p2.setBorder(border);
p3.setBorder(new TitledBorder("狀態(tài)欄"));
frame.add(p1);
frame.add(p2, "South");
frame.add(p3, "East");
setSize(750, 450);
setLocationRelativeTo(getOwner());
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 事件監(jiān)聽(tīng)
connection.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ct = new ClientThread(GroupChat_Client.this);
GroupChat_Client.this.setClient(ct);
}
});
submit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ct.Sent();
} catch (NullPointerException e1) {
JOptionPane.showMessageDialog(null, "還沒(méi)有連接服務(wù)器!");
}
}
});
}
public void setClient(ClientThread ct) {
this.ct = ct;
}
public static void main(String[] args) {
new GroupChat_Client();
}
}
class ClientThread extends Thread {
Socket connection;
DataOutputStream dataout;
DataInputStream datain;
GroupChat_Client k;
public ClientThread(GroupChat_Client k) {
this.k = k;
try {
connection = new Socket("127.0.0.1", 3999);
k.conMessage.setText("與服務(wù)器連接成功...");
dataout = new DataOutputStream(connection.getOutputStream());
datain = new DataInputStream(connection.getInputStream());
} catch (BindException e) {
JOptionPane.showMessageDialog(null, "已連接!");
} catch (IOException e) {
}
start();
}
public void run() {
String msg = null;
while (true) {
try {
msg = datain.readUTF();
} catch (SocketException e) {
JOptionPane.showMessageDialog(null, "連接斷開(kāi)!");
break;
} catch (IOException e) {
e.printStackTrace();
}
if (msg != "" msg.trim() != "") {
k.Txt.append(msg + "\n");
}
}
}
void Sent() {
try {
if (k.SentTxt.getText().equals("")) {
JOptionPane.showMessageDialog(null, "請(qǐng)輸入信息!");
} else {
dataout.writeUTF(k.name.getText()+":" + k.SentTxt.getText());
k.SentTxt.setText("");
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "連接失敗!");
e.printStackTrace();
} catch (NullPointerException e1) {
JOptionPane.showMessageDialog(null, "連接失敗!");
}
}
}
網(wǎng)頁(yè)標(biāo)題:java代碼實(shí)現(xiàn)群鏈接 java集群怎么實(shí)現(xiàn)
網(wǎng)站URL:http://chinadenli.net/article20/ddeejjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、定制網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容