swing聊天室

服务器端

//服务器中不停的接收客户端的链接多线程类
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);
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值