⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpleserversocket.java

📁 JAVA编的简单的Socket程序
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.util.*;
import java.io.*;

public class simpleserversocket extends JFrame implements ActionListener {
	
	
	JLabel lab1 = new JLabel("用户在线列表");
    JLabel lab2 = new JLabel("消息:");
    JTextArea ta = new JTextArea(9,30);
    java.awt.List list = new java.awt.List(9);
    JTextField tf = new JTextField(24);
    JButton b = new JButton("发送");
    JScrollPane sp = new JScrollPane();
    JPanel p1 = new JPanel();
    JPanel p2 = new JPanel();
    JPanel p3 = new JPanel();
    
    ServerSocket serverSocket;
    Socket socket;
    ArrayList array = new ArrayList();
    int connect;

	
	 public simpleserversocket()
    {
        super("聊天服务器");
        
        
        sp.getViewport().add(ta);
        p1.setLayout(new BorderLayout());
        p3.add(lab1);
        p1.add(p3,BorderLayout.NORTH);
        p1.add(list,BorderLayout.SOUTH);
        p2.add(lab2);
        p2.add(tf);
        p2.add(b);
        getContentPane().add(sp,BorderLayout.NORTH);
        getContentPane().add(p1,BorderLayout.CENTER);
        getContentPane().add(p2,BorderLayout.SOUTH);
        pack();
        
        
        
        //服务器端界面居中显示
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = this.getSize();
        if(frameSize.width > screenSize.width)
        {
            frameSize.width = screenSize.width;
        }
        if(frameSize.height > screenSize.height)
        {
            frameSize.height = screenSize.height;
        }
        setLocation((screenSize.width - frameSize.width)/2,
                    (screenSize.height - frameSize.height)/2);
        
        //增加按键发送的事件注册与处理
         b.addActionListener(this);
         
        setSize(400,430);
        setVisible(true);
        setResizable(false);
        
        
        ////开始启动服务器监听端口
        
         if(serverSocket == null)
                {
                    try
                    {
                        serverSocket = new ServerSocket(7000);
                        ta.append("系统提示:"+"                  聊天服务器"
                                  +"                  成功启动......\n");
                    }
                    catch(IOException ex)
                    {
                        ta.append("系统提示:"+"                  聊天服务器"
                                  +"                  启动失败!\n");
                    }
                }
                else
                {
                    ta.append("系统消息:"+"                  聊天服务器"
                              +"                  已经启动......\n");
                }
     
     
     ////////////////////////////////////////////////////
     
     
     while(true)
            {
                if(array.size() <= 10)
                {
                    try
                    {
                        socket = serverSocket.accept();
                         ta.append("有一个客户连接成功:                  \n");
                    }
                    catch(IOException ex)
                    {
                        ta.append("系统消息:                  "+ex+"\n");
                    }
                   //创建客户端线程,一个线程对应一个客户端
                  Client c = new Client(socket);
                  array.add(c);
                  c.start();
                }
                else
                {
                    ta.append("系统消息:"+"                  聊天服务器"
                              +"                  已经超过最大连接数,请待会连接!\n");
                }
            }
     /////////////////////////////////////////////////
     
     
   
     
    }
    
    /////////////////////////////////////////////////////////////
    
     
      class Client extends Thread
    {
        String name;
        String ip;
        String ipAddress;
        Socket socket;
        BufferedReader br;
        PrintStream ps;

        public Client(Socket s)
        {
            try
            {
                socket = s;
                br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                ps = new PrintStream(s.getOutputStream());
            }
            catch (IOException ex)
            {
                ta.append("系统消息:                  "+ex+"\n");
            }
        }

        public void run()
        {
            String info;
            try
            {
                while(true)
                {
                    info = br.readLine();
                    if(info == null)
                        break;
                    StringTokenizer st = new StringTokenizer(info, ":");
                    String keyword = st.nextToken();

                   //处理客户端传来的信息
                
                    if (keyword.equals("CONNECT"))
                    {
                        name = st.nextToken();
                        ip = st.nextToken();
                        ipAddress = ip.substring(ip.indexOf("/")+1);
                        ta.append("系统消息:                  " + name + "/"
                                  + ipAddress +"                  已经连接\n");
                        list.add(name + ":                    " + ip
                                 +":                    已经登录");
                            notifyChatRoom();
                       
                    }
                    else if (keyword.equals("MSG"))
                    {
                        String broadcast = st.nextToken();
                        StringBuffer message = new StringBuffer("MSG:" +broadcast);
                        message.append(st.nextToken("\0"));
                        if (broadcast.equals("BROAD"))
                        {
                          sendToClients(message);
                        }
                        else
                        {
                            sendToClient(message, broadcast);
                        }
                    }
                    
                    else if (keyword.equals("QUIT"))
                    {
                       /////////////////////////////
                       
                     
            	         ta.append("系统消息:                  " + this.name+ "/"
                                 + this.ipAddress +"                  已经断开\n");
           	 	         ps.println(new StringBuffer("QUIT:"+this.name));//给客户机发断开的消息
            	         ps.flush();
            	         socket.close();  //关闭socket
            	         array.remove(this);//从列表中删除这个对象。
            	                         
                        //重新更新客户列表
                        list.removeAll();
                        for (int i = 0; i < array.size(); i++)
                        {
                            Client c = (Client) array.get(i);
                            list.add(c.name + ":                    " + c.ip
                                     +":                    已经登录", i);
                            
                        }
                          notifyChatRoom();
                     
                        break;
                    }
                    
                    
                    
                }
                
            }
            catch (IOException ex)
            {
                ta.append("系统消息:                  "+ex+"\n");
               
            }
        }
		
			public void send(StringBuffer msg)
        {
            ps.println(msg);
            ps.flush();
        }
		
        
	}
	
    ///////////////////////////////////////////////////////////////
      public synchronized void sendToClients(StringBuffer msg)
    {
        for(int i=0;i<array.size();i++)
        {
            Client c = (Client)array.get(i);
            c.send(msg);
            
        }
    }

    public synchronized void sendToClient(StringBuffer msg,String s)
    {
        for(int i=0;i<array.size();i++)
        {
            Client c = (Client)array.get(i);
            if(c.name.equals(s))
            {
            	
                 c.send(msg);
                
                break;
            }
        }
    }  
   /////////////////////////////////
   public void actionPerformed(ActionEvent e)
            {
                    
                  ////////////////////
              if(e.getActionCommand().equals("发送"))
           {
           	  //如果想只给某一个客户机发消息,则i>0
           	  int i=-10;
           	   String client1=list.getSelectedItem();
           	     StringTokenizer stc = new StringTokenizer(client1,":");
                String user = stc.nextToken();
           	    StringBuffer msg=null;
           	   if(i>0)
           	   {
           	   	 msg = new StringBuffer("MSG:"+"BROAD:");
           	     msg.append("Server:"+tf.getText());
           	   	  sendToClients(msg);
           	   }          	   
              else
              {
              	  msg = new StringBuffer("MSG:"+stc+":");
              	    msg.append("Server:"+tf.getText());
              	  sendToClient(msg,user);
              }
              
             
               tf.setText("");
           }
          
          
          
          
             ///////////////////////
            }     
    ///增加一个主方法    
 public static void main(String[] args)
    {
        simpleserversocket app = new simpleserversocket();
    }	


	
	 //通知客户端刷新用户列表
    public void notifyChatRoom()
    {
        StringBuffer sb = new StringBuffer("PEOPLE");
        for(int i=0;i<array.size();i++)
        {
            Client c =(Client)array.get(i);
            sb.append(":"+c.name);
        }
        sendToClients(sb);
    }
    
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -