zoukankan      html  css  js  c++  java
  • java socket多线程聊天室

    SERVER

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    import java.util.*;
    public class Server extends JFrame implements Runnable,ActionListener{
    	JPanel jp;
    	JButton jb,jb2;
    	ServerSocket ss;
    	Socket s;
    	ArrayList al=new ArrayList();
    	HuThread ht;
    	JTextArea jta;
    	JScrollPane jsp;
    	boolean hufan=true;
    	public static void main(String[] args) {
    		new Server();
    	}
    	public Server(){
    		jp=new JPanel();
    		jb=new JButton("启动服务器");
    		jb2=new JButton("关闭服务器");
    		jb.addActionListener(this);
    		jb2.addActionListener(this);
    		jta=new JTextArea();
    		jsp=new JScrollPane(jta);
    		jp.add(jb);
    		jp.add(jb2);
    		this.add(jsp);
    		this.add(jp,"North");
    		this.setSize(400, 300);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
    	@Override
    	public void run() {
    		while(hufan){
    			try {
    				s=ss.accept();
    				al.add(s);
    				ht=new HuThread(s,al);
    				Thread tt=new Thread(ht);
    				tt.start();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if(e.getSource()==jb){
    			try {
    				ss=new ServerSocket(5555);
    				hufan=true;
    				jta.setText("服务器已经启动");
    				Thread t=new Thread(this);
    				t.start();
    			} catch (Exception e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    		}else if(e.getSource()==jb2){
    			try {
    				hufan=false;
    				ss.close();
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			jta.setText("服务器已经关闭");
    		}
    	}
    }
    class HuThread implements Runnable{
    	Socket s;
    	ArrayList al;
    	public HuThread(Socket s,ArrayList al){
    		this.s=s;
    		this.al=al;
    	}
    	public void run() {
    		try{
    			BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
    			while(true){
    				String info=br.readLine();
    				for(int i=0;i<al.size();i++){
    					Socket s2=(Socket)al.get(i);
    					PrintWriter pw=new PrintWriter(s2.getOutputStream());
    					pw.println(info);
    					pw.flush();
    				}
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    	
    }


     

    CLIENT

    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    public class Client extends JFrame implements ActionListener,Runnable{
        JTextArea jta;
        JTextField jtf;
        JPanel jp;
        JButton jb;
        BufferedReader in;
        PrintWriter out;
        JScrollPane jsp;
        public static void main(String args[]){
            Client c = new Client();
           // c.receive();
        }
        public Client(){
        	jp=new JPanel();
            jta=new JTextArea();
            jta.setEditable(false);
            jsp=new JScrollPane(jta);
            jb=new JButton("发送");
            jb.addActionListener(this);
            jtf=new JTextField(20);
            jp.add(jtf);
            jp.add(jb);
            this.add(jsp,"Center");
            this.add(jp,"South");
            
            try {
                Socket s = new Socket("127.0.0.1",5555);
                System.out.println("客户连接服务器成功");
                out = new PrintWriter(s.getOutputStream());
                in = new BufferedReader(new InputStreamReader(s.getInputStream()));//包装成字符流
            } catch (Exception e) {
                e.printStackTrace();
            } 
        	Thread t=new Thread(this);
        	t.start();
            this.setSize(400,300);
            this.setLocation(400, 300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);
        }
        //消息接收
    //    private void receive(){
    //        try {
    //            while(true){
    //                String str = in.readLine();//读BufferedReader
    //                if(str==null){
    //                    return ;
    //                }
    //                jta.append("说"+str+"\r\n");//加载到JTextArea中,显示
    //            }
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //        }
    //    }
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		String text=jtf.getText();
            jtf.setText("");
            out.println(text);
            out.flush();
    	}
    	@Override
    	public void run() {
    		try {
    			while (true) {
    				String str = in.readLine();
    				if (str != null) {
    					jta.append("说" + str + "\r\n");
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }


  • 相关阅读:
    前端 二
    web 作业 01
    前端 一
    mysql 了解性知识
    数据查询优化之mysql索引
    yml格式或者叫做YAML格式数据学习
    执行sql报错:Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
    大型网站架构之分布式消息队列(转)
    intellj利用 maven自动生成dto,mapper文件
    对memcached使用的总结和使用场景(转)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2992107.html
Copyright © 2011-2022 走看看