服务器端
//服务器中不停的接收客户端的链接多线程类
public class Server implements Runnable{
private ServerSocket server;
private boolean isRunnable=false;
private BackInterface back;
ServerClientSocket socket;
public Server(BackInterface back) {
try {
server=new ServerSocket(9999);
System.out.println("服务器已启动");
this.back=back;
} catch (Exception e) {
e.printStackTrace();
}
}
public void startServer() {
isRunnable=true;
if (socket!=null) {
socket.setA(false);
}
new Thread(this).start();
}
public void stopServer() {
isRunnable=false;
if (socket!=null) {
socket.setA(true);
}
}
@Override
public void run() {
while (isRunnable) {
try {
//1.不停的等待连接2.有客户端连接进来会创建一个管道对象
Socket client=server.accept();
//3.通过管道对象可以获取客户端的IP+端口信息
String ip=client.getInetAddress().getHostAddress();
int port =client.getPort();//获取端口
InputStream read=client.getInputStream();
byte bts[]=new byte[1024];
int len=read.read(bts);
String name1=new String(bts,0,len);
System.out.println(name1);
//6.启动另外一个线程不停的接受客户端消息
ObjectOutputStream write=new ObjectOutputStream(client.getOutputStream());
socket=new ServerClientSocket(client, back,name1,write);
//4.将添加进来的客户信息加入到Map集合中
ServerManager.CLIENTS.put(name1, socket);
List<String>list = new ArrayList<String>();
for(String key:ServerManager.CLIENTS.keySet()){
list.add(key);
}
for (ServerClientSocket socket:ServerManager.CLIENTS.values()) {
socket.senMsgAll(list);
}
//5.刷新界面
back.clientCome();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//服务器中不停接收消息的多线程类
public class ServerClientSocket implements Runnable,Serializable {
private Socket socket=null;
private ObjectInputStream in=null;
private ObjectOutputStream out=null;
private boolean isRunnble=true;
private BackInterface back;
private boolean a=false;
String name;
public boolean isA() {
return a;
}
public void setA(boolean a) {
this.a = a;
}
public void setisRunnble(boolean faly) {
isRunnble=faly;
}
public boolean getisRunnble() {
return isRunnble;
}
public ServerClientSocket(Socket socket,BackInterface back,String name,ObjectOutputStream write) {
this.name=name;
this.socket=socket;
this.back=back;
this.out=write;
new Thread(this).start();
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
// out=new ObjectOutputStream(socket.getOutputStream());
in =new ObjectInputStream(socket.getInputStream());
while(isRunnble){
Message msg=(Message)in.readObject();
if (a) {
continue;
}
back.msgBack(msg);
}
} catch (Exception e) {
e.printStackTrace();
ServerManager.CLIENTS.remove(name);
back.clientCome();
List<String>list = new ArrayList<String>();
for(String key:ServerManager.CLIENTS.keySet()){
list.add(key);
}
for (ServerClientSocket socket:ServerManager.CLIENTS.values()) {
socket.senMsgAll(list);
}
}
}
public void senMsg(Message msg) {
try {
out.writeObject(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
public void senMsgAll(List<String> msg) {
try {
out.writeObject(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户机
public class kehuServerClientSocket implements Runnable{
private Socket socket=null;
private ObjectInputStream in=null;
private ObjectOutputStream out=null;
private boolean isRunnble=true;
private BackInterface back;
public kehuServerClientSocket(Socket socket,BackInterface back) {
this.socket=socket;
this.back=back;
new Thread(this).start();
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
in =new ObjectInputStream(socket.getInputStream());
out=new ObjectOutputStream(socket.getOutputStream());
while(isRunnble){
Object msg=in.readObject();
if (msg instanceof Message) {
Message z=(Message)msg;
System.out.println(z.getName());
back.msgBack(z);
}else{
List<String>list=(List<String>) msg;
ServerManager.list=list;
back.clientCome();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void senMsg(Message msg) {
try {
out.writeObject(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户界面
public class kehu extends JFrame implements BackInterface {
private JPanel contentPane;
private JTextField text;
private JTextArea text_show;
private JButton button;
private JLabel label;
private JLabel lblip;
private JLabel lblNewLabel;
String name;
ObjectOutputStream out;
private JLabel lblNewLabel_1;
private JLabel text2;
private JList list;
private JButton btnNewButton;
/**
* Launch the application.
*/
/**
* Create the frame.
*/
public kehu(String name) {
this.name=name;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 576, 337);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
text_show = new JTextArea();
JScrollPane scrollPane = new JScrollPane(text_show);
scrollPane.setBounds(24, 50, 273, 145);
contentPane.add(scrollPane);
text = new JTextField();
text.setBounds(24, 198, 273, 21);
contentPane.add(text);
text.setColumns(10);
button = new JButton("发送");
button.setBounds(73, 234, 93, 23);
contentPane.add(button);
label = new JLabel("");
label.setBounds(24, 165, 54, 15);
contentPane.add(label);
lblip = new JLabel("名称:");
lblip.setBounds(24, 10, 54, 15);
contentPane.add(lblip);
lblNewLabel = new JLabel("New label");
lblNewLabel.setBounds(73, 10, 224, 15);
contentPane.add(lblNewLabel);
Socket socket=null;
try {
socket = new Socket("localhost",9999);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String ip=socket.getInetAddress().getHostAddress();
try {
OutputStream write=socket.getOutputStream();
byte bts[]=new byte[1024];
bts=name.getBytes();
write.write(bts);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
int port =socket.getPort();//获取端口
lblNewLabel.setText(name);
list = new JList();
JLabel label_1 = new JLabel("当前在线:");
label_1.setBounds(380, 14, 101, 18);
contentPane.add(label_1);
JScrollPane scrollPane_1 = new JScrollPane(list);
scrollPane_1.setBounds(378, 47, 123, 148);
contentPane.add(scrollPane_1);
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
String str=list.getSelectedValue().toString();
text2.setText(str);
}
});
lblNewLabel_1 = new JLabel("私聊:");
lblNewLabel_1.setBounds(375, 199, 72, 18);
contentPane.add(lblNewLabel_1);
text2 = new JLabel("选择私聊对象");
text2.setBounds(408, 199, 93, 18);
contentPane.add(text2);
btnNewButton = new JButton("私聊发送");
btnNewButton.setBounds(184, 236, 101, 21);
contentPane.add(btnNewButton);
kehuServerClientSocket zg=new kehuServerClientSocket(socket,kehu.this);
btnNewButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Message msg=new Message(text.getText(), new Date(), ip, text2.getText(),name);
zg.senMsg(msg);
text.setText("");
}
});
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Message msg=new Message(text.getText(), new Date(), ip, "404",name);
zg.senMsg(msg);
// text_show.append(text.getText()+"\r\n");
text.setText("");
}
});
}
@Override
public void msgBack(Message msg) {
// TODO Auto-generated method stub
String str=msg.getTime().toLocaleString()+" "+msg.getName()+": \r\n "+msg.getContent()+"\r\n";
text_show.append(str+"\r\n");
}
@Override
public void clientCome() {
// TODO Auto-generated method stub
DefaultListModel<String>model=new DefaultListModel<String>();
System.out.println(ServerManager.list.size());
for(String li:ServerManager.list){
if (!name.equals(li)) {
model.addElement(li);
}
}
list.setModel(model);
}
}
服务器界面
public class ServerFramae extends JFrame implements ActionListener,BackInterface{
private JPanel contentPane;
private JTextField text_input;
private JButton btn_start;
private JButton btn_stop;
private JButton btn_send;
private JButton btn_sendall;
private JList list_client;
private JLabel lab_showip;
private JTextPane textPane;
private JTextArea text_show;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ServerFramae frame = new ServerFramae();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ServerFramae() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 489, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
btn_start = new JButton("开启服务");
btn_start.setBounds(10, 10, 93, 23);
contentPane.add(btn_start);
btn_stop = new JButton("关闭服务 ");
btn_stop.setBounds(113, 10, 93, 23);
contentPane.add(btn_stop);
text_input = new JTextField();
text_input.setBounds(37, 205, 193, 21);
contentPane.add(text_input);
text_input.setColumns(10);
list_client = new JList();
list_client.setBounds(281, 43, 119, 111);
contentPane.add(list_client);
lab_showip = new JLabel("New label");
lab_showip.setBounds(281, 178, 165, 15);
contentPane.add(lab_showip);
btn_send = new JButton("发送");
btn_send.setBounds(242, 204, 93, 23);
contentPane.add(btn_send);
btn_sendall = new JButton("发送给所有人");
btn_sendall.setBounds(345, 204, 118, 23);
contentPane.add(btn_sendall);
text_show = new JTextArea();
btn_start.addActionListener(this);
btn_stop.addActionListener(this);
btn_send.addActionListener(this);
btn_sendall.addActionListener(this);
JScrollPane scrollPane = new JScrollPane(text_show);
scrollPane.setBounds(37, 43, 171, 102);
contentPane.add(scrollPane);
btn_send.setEnabled(false);
btn_sendall.setEnabled(false);
btn_stop.setEnabled(false);
btn_start.setEnabled(true);
list_client.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
ListModel model=list_client.getModel();
String str=list_client.getSelectedValue().toString();
lab_showip.setText(str);
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton xun=(JButton) e.getSource();
if (xun.equals(btn_start)) {
start();
}
if (xun.equals(btn_stop)) {
stop();
}
if (xun.equals(btn_send)) {
send();
}
if (xun.equals(btn_sendall)) {
sendall();
}
}
private void sendall() {
// TODO Auto-generated method stub
Message msg=new Message(text_input.getText(), new Date(), "", "","系统");
for (ServerClientSocket socket:ServerManager.CLIENTS.values()) {
socket.senMsg(msg);
}
text_show.append(msg.getTime().toLocaleString()+" "+msg.getName()+": \r\n "+msg.getContent()+"\r\n");
text_input.setText("");
}
private void send() {
// TODO Auto-generated method stub
String reIp=lab_showip.getText();
Message msg=new Message(text_input.getText(), new Date(), "", reIp,"系统");
ServerManager.CLIENTS.get(reIp).senMsg(msg);
text_show.append(msg.getTime().toLocaleString()+" "+msg.getName()+": \r\n "+msg.getContent()+"\r\n");
text_input.setText("");
}
private void stop() {
if (ServerManager.SERVER!=null) {
ServerManager.SERVER.stopServer();
}
btn_send.setEnabled(false);
btn_sendall.setEnabled(false);
btn_stop.setEnabled(false);
btn_start.setEnabled(true);
}
private void start() {
// TODO Auto-generated method stub
if (ServerManager.SERVER==null) {
ServerManager.SERVER=new Server(ServerFramae.this);
ServerManager.SERVER.startServer();
}else {
ServerManager.SERVER.startServer();
};
btn_send.setEnabled(true);
btn_sendall.setEnabled(true);
btn_stop.setEnabled(true);
btn_start.setEnabled(false);
}
@Override
public void msgBack(Message msg) {
// TODO Auto-generated method stub
if (!msg.getReIp().equals("404")) {
msg.setName("来自 "+msg.getName()+" 的私聊");
System.out.println(msg.getName());
ServerManager.CLIENTS.get(msg.getReIp()).senMsg(msg);
}else {
String str=msg.getTime().toLocaleString()+" "+msg.getName()+": \r\n "+msg.getContent()+"\r\n";
text_show.append(str+"\r\n");
for (ServerClientSocket socket:ServerManager.CLIENTS.values()) {
socket.senMsg(msg);
}
}
}
@Override
public void clientCome() {
// TODO Auto-generated method stub
DefaultListModel<String>model=new DefaultListModel<String>();
for(String key:ServerManager.CLIENTS.keySet()){
model.addElement(key);
}
list_client.setModel(model);
}
}