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

📄 netserver.java

📁 java编写的聊天室
💻 JAVA
字号:
package com.java.study.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;


import java.util.LinkedList;
import java.util.Collections;
import java.util.Collection;
import java.util.Iterator;


public class NetServer implements Runnable {
	public NetServer(int port) throws IOException{
			serverSocket = new ServerSocket(port);
			messageQueue = new LinkedList<SingleServer>();
			synizeQueue  = Collections.synchronizedCollection(messageQueue);
			
	}
       
	public void run(){
		while(true){
			try{
				Socket connSocket= serverSocket.accept();
				if(connSocket != null){
					++threadID;
					SingleServer newEvent = new SingleServer(connSocket,threadID);
					synizeQueue.add(newEvent);
					Thread newThread      = new Thread(newEvent);
					newThread.setDaemon(true);
					newThread.start();
				}
				Thread.yield();
			}catch(IOException e){
				e.printStackTrace();
			}
		}

	}
	
	

	private ServerSocket serverSocket;
	private LinkedList<SingleServer> messageQueue;
	private Collection<SingleServer> synizeQueue;
	private int	threadID = 0;
	//private HashMap<String,InetAddress> addressMap;
	
	private class SingleServer implements Runnable
	{
		
		SingleServer(Socket connSocket,int id) throws IOException{
			this.connSocket = connSocket;
			inputStream = connSocket.getInputStream();
			outStream   = connSocket.getOutputStream();
			outWrite    = new PrintWriter(outStream,true);
			personInfo  = new ThreadID();
			personInfo.ithreadID = id;
		}
		
		public int GetThreadID() {
				if(personInfo == null) throw new NullPointerException("personInfo is null");
				return personInfo.ithreadID;
		}
		
		public void SendMessage(String message){
			if(outWrite == null) throw new NullPointerException("outWrite is null"); 
			outWrite.println(message);
		}
		
		
		private void SendMessageStartAndEnd(String message){
			Iterator<SingleServer> it1 = synizeQueue.iterator();
			while(it1.hasNext()){
				SingleServer temp = it1.next();
				if(personInfo.ithreadID != temp.GetThreadID()){
					temp.SendMessage(personInfo.threaName + message);
				}
			}
		}
		
		public void run(){
				Scanner inScanner = new Scanner(inputStream);
				SendMessage("请输入你的名字 : (并以#结束)");
				while(inScanner.hasNext()){
					String name= inScanner.nextLine();
					name.trim();
					if(name.endsWith("#")){
						personInfo.threaName = name.substring(0,name.indexOf("#"));
						break ;
					}
					Thread.yield();
				}
				try{
					while(true){
						SendMessage("欢迎进入聊天室。 退出聊天 --- exit");
						SendMessageStartAndEnd("进入聊天室。");
					
						while(inScanner.hasNextLine()){
							String sz = inScanner.nextLine();
							sz.trim();
							Iterator<SingleServer> it = synizeQueue.iterator();
							
							if(sz.length() != 0){
								
								if(sz.toLowerCase().equals("exit")){
									
									SendMessageStartAndEnd("退出聊天室。");
									Iterator<SingleServer> itremove = synizeQueue.iterator();
									
									while(itremove.hasNext()){
										SingleServer remove = itremove.next();
										if(remove.GetThreadID() == personInfo.ithreadID)
											itremove.remove();
									}
									connSocket.close();
									return ;
								}
							
								while(it.hasNext()){
									SingleServer temp = it.next();
									if(personInfo.ithreadID != temp.GetThreadID()){
										temp.SendMessage("");
										temp.SendMessage(personInfo.threaName + ": " + sz);
									}
								}
							}
							Thread.yield();
						}
						Thread.yield();
					}
				}catch(IOException e){
					e.printStackTrace();
				}
		}
		
		private ThreadID     personInfo  = null;
		private Socket 		 connSocket  = null;
		private InputStream  inputStream = null;
		private OutputStream outStream   = null;
		private PrintWriter  outWrite    = null;
		
	}
}

⌨️ 快捷键说明

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