📄 netserver.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 + -