十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
mysql集群是master-slaver模式,java程序当然是链接master那台机器了,slaver只是给master做辅助的。
成都创新互联是一家专注于做网站、网站建设与策划设计,凌云网站建设哪家好?成都创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:凌云等地区。凌云做网站价格咨询:18982081108
直接用socket和servsocket开发。命令行形式,改造成可视化的话,需要拆分功能。懒。
主要思路:
客户端 连接到服务 获取输入输出流。分别用2个线程处理输入流和输出流。
服务端 使用Set集合保存socket信息。同时使用线程安全Queue保存接收到的message。使用一个线程处理输入流,并将接到的封装成一个Message对象放到Queue中,对象保存连接的socket信息。另开一个线程用于从Queue获取消息,然后分发消息到Set中socket。
只是一个粗糙的即时聊天室。无缓冲功能。新用户加入进来不能获取以前的消息。只能获取加入后的其他人再发送的消息。
像这样:服务端测试:message中socket标识消息来源。
使用三个客户端测试:
服务器 端 使用个链表把在线用户账号和他对应的链接保存起来。例如 soket。
之后 定义一个协议,
在 客户端发出来的 聊天信息前面添加一个头。
例如,1表示群聊,2表示私聊,3表示添加好友,等等。每一个行为对应一个编码超过10个可以使用字母。
群聊的话,没什么好说,每个人发一个;
私聊,那么接下来的一个字符可以表示,私聊对象的账户名 的长度,比如 tom的 长度就是3,
之后,根据长度,截取 第3到第5个字符,截取到 此次 私聊信息是发送给 tom 的。
这条发送给服务器,希望他转发给tom的 消息就应该是
"23tom你好!"
之后去链表里面找tom 的soket 链接。打开他的 输出流,给他传送 聊天信息。
欢迎追问。
一楼的思路是正确的,我给你代码参考!
GroupChat_Server.java
--------------------------------------------------------------------------
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java点虐 .ServerSocket;
import java点虐 .Socket;
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class GroupChat_Server {
static DataOutputStream dataouts;
static int count = 0;
//创建一个集合类的数组,存放客户端的对象
public static ArrayListSocket socketList = new ArrayListSocket();
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(3999);//开设服务器端口3999
JOptionPane.showMessageDialog(null, "服务器启动成功");
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对象存进数组
new Thread(new ServerThread(s)).start();//为每个客户端创建一个进程
}
} 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());//获取客户端发来的数据
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
String content = null;
while ((content = readFromClient()) != null) {
for (Socket s : GroupChat_Server.socketList) {//遍历数组
DataOutputStream dataout = new DataOutputStream(
s.getOutputStream());
dataout.writeUTF(content);
dataout.flush();//将缓冲区的数据全部输出!
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String readFromClient() {//封装客户端发来的数据
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点虐 .BindException;
import java点虐 .Socket;
import java点虐 .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服务器还没有启动!/p br p请启动服务器.../pbody/html",
0);
name = new JTextField();
name.setText("客户端["+GroupChat_Server.count+"]");
p3.add(new JLabel(" 欢迎使用,请设置呢称: ", 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("状态栏"));
frame.add(p1);
frame.add(p2, "South");
frame.add(p3, "East");
setSize(750, 450);
setLocationRelativeTo(getOwner());
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 事件监听
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, "还没有连接服务器!");
}
}
});
}
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("与服务器连接成功...");
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, "连接断开!");
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, "请输入信息!");
} 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, "连接失败!");
}
}
}