62,614
社区成员
发帖
与我相关
我的任务
分享
public class Client {
private Socket client;
public Client() {
try {
client=new Socket("localhost",8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
GetServerInfoHandler handler=new GetServerInfoHandler(client);
Thread thread=new Thread(handler);
thread.setDaemon(true);
thread.start();
try {
PrintWriter writer=new PrintWriter(client.getOutputStream());
System.out.println("请输入你的昵称(不少于2位):");
Scanner sc=new Scanner(System.in);
String nickName="";
while(nickName.length()<2){
System.out.println("请输入你的昵称:");
nickName=sc.nextLine().trim();
}
System.out.println("你好!"+nickName+"可以聊天啦");
while(true){
System.out.println(nickName+":"+sc.nextLine());
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
class GetServerInfoHandler implements Runnable{
private Socket socket;
public GetServerInfoHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while(true){
System.out.println(reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().start();
}
}
public class Server {
private ServerSocket server;
private ExecutorService threadPool;
private Vector<PrintWriter> allOut;
private BlockingQueue<String> messageQueue;
public Server() {
try {
server=new ServerSocket(8088);
threadPool=Executors.newCachedThreadPool();
allOut=new Vector<PrintWriter>();
messageQueue=new LinkedBlockingQueue<String>();
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
try {
SendMsgToAllClientHandler sendThread=new SendMsgToAllClientHandler();
Thread thread=new Thread(sendThread);
thread.setDaemon(true);
thread.start();
while(true){
System.out.println("等待客户端连接。。。");
Socket socket=server.accept();
System.out.println("一个客户端连接。。");
ClientHandler handler=new ClientHandler(socket);
threadPool.execute(handler);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public class ClientHandler implements Runnable{
private Socket client;
public ClientHandler(Socket client) {
this.client = client;
}
public void run() {
PrintWriter writer=null;
try {
writer=new PrintWriter(client.getOutputStream());
allOut.add(writer);
BufferedReader reader=new BufferedReader(
new InputStreamReader(client.getInputStream()));
while(true){
messageQueue.offer(reader.readLine(),5,TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
synchronized (allOut) {
allOut.remove(writer);
}
}
}
}
class SendMsgToAllClientHandler implements Runnable{
public void run() {
while(true){
if(messageQueue.peek()!=null){
String str=messageQueue.poll();
synchronized (allOut) {
for(PrintWriter writer:allOut){
writer.println(str);
writer.flush();
}
}
}
try {
if(messageQueue.size()==0){
Thread.sleep(250);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}