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

📄 chatserver.java

📁 基础性的JAVA源代码
💻 JAVA
字号:
package exec.day1023;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class ChatServer extends JFrame{
	private JTextArea ta;
	private Hashtable pw_ht;
	private JList name_list;
	private Vector name_vector;
	
	public void init(){
		setTitle("服务器端");
		ta = new JTextArea();
		pw_ht = new Hashtable(30);
		name_list = new JList();
		
		name_vector = new Vector();
		name_vector.add("Name List:");
		name_list.setListData(name_vector);
		
		add(ta);
		add(name_list,"West");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,400);
		setVisible(true);
	}
	
	public ChatServer(){
		this.init();
		try{
			ServerSocket server = new ServerSocket(6666);
			while(true){
				Socket socket = server.accept();
				ServerThread  each = new ServerThread(socket);
				each.start();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 每个线程对象的socket属性对应了一个客户端,
	 * 通过该socket进行的只能是和该客户端的通讯
	*/
	class ServerThread extends Thread{
		Socket socket;

		public ServerThread(Socket socket){
			this.socket = socket;
		}
		public void run(){
			try{
				ObjectOutputStream pw = new ObjectOutputStream(socket.getOutputStream());
				ObjectInputStream br = new ObjectInputStream(socket.getInputStream());
				String name = (String)br.readObject();
				/**
				 * 将每个线程使用的pw存入到集合中
				 * 用于向每个用户发送聊天信息
				 */
				pw_ht.put(name,pw);

				//将刚连接的用户姓名加在列表中
				name_vector.add(name);
				name_list.setListData(name_vector);
				//给所有的客户端发送最新的存放用户姓名的name_vector
				Collection all_pw = pw_ht.values();
				for(Object key:all_pw){
					ObjectOutputStream oos = (ObjectOutputStream)key;
					oos.writeObject(name_vector);
					oos.reset();
				}
				
				while(true)	{
					Object o = br.readObject();					
					Info result = (Info)o;
					String dest = result.getDest();  
					String data = result.getData();
					String oldData = data;
					if(dest.equals("all")){
						if(data!=null && data.equals("quit!")){							
							data = "系统管理员:"+name+"离开!";
							pw_ht.remove(name);
							//将用户从列表中删除
							name_vector.remove(name);
							name_list.setListData(name_vector);
							pw.writeObject("q");
							pw.flush();
							pw.reset();
						}else{
							data = name+"  say: " + data;
						}						
						ta.append(data+"\n");
						//给所有的客户端发送聊天信息
						Collection all_pw1 = pw_ht.values();						
						for(Object key:all_pw1){
							ObjectOutputStream oos1 = (ObjectOutputStream)key;
							oos1.writeObject(data);
							oos1.writeObject(name_vector);
							oos1.reset();
						}
						if(oldData!=null && oldData.equals("quit!")){							
							return;
						}
					}else{						
						data = name +  "  say to  " + dest + " : " + data;					
						ta.append(data+"\n");
						ObjectOutputStream oos_dest = (ObjectOutputStream)pw_ht.get(dest);
						oos_dest.writeObject(data);
						pw.writeObject(data);
						oos_dest.reset();  
						pw.reset();
					}					
				}	
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args){
		new ChatServer();
	}
}

⌨️ 快捷键说明

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