您的位置:首页 > 编程语言 > Java开发

聊天室

2016-04-11 00:00 323 查看
摘要: 除了有群聊功能还有一对一聊天,并且可以设置昵称,但是没有代码讲解。

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 服务端
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) {
Server server = new Server();
server.start();
}
ExecutorService threadPool;
private ServerSocket serverSocket;
private Map<String,PrintWriter> allOut;
public Server(){
threadPool = Executors.newFixedThreadPool(40);
allOut = new HashMap<String,PrintWriter>();
try{
serverSocket = new ServerSocket(8088);
}catch(Exception e){
e.printStackTrace();
}
}
private synchronized void addOut(String nickName,PrintWriter out){
allOut.put(nickName, out);
}
private synchronized void removeOut(String nickName){
allOut.remove(nickName);
}
private synchronized void sendMessage(String message){
for(PrintWriter pw:allOut.values()){
pw.println(message);
}
}
private synchronized void sendMessageToOne(String nickName,String message){
PrintWriter pw = allOut.get(nickName);
if(pw!=null){
pw.println(message);
}
}
private class ClientHandler implements Runnable{
private Socket socket;
private String nickName;
public ClientHandler(Socket socket){
this.socket = socket;
}
public void run(){
PrintWriter pw = null;
try{
pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
nickName = getNickName();
addOut(nickName,pw);
Thread.sleep(100);
sendMessage(nickName+"上线了!");
sendMessage("当前在线人数:"+allOut.size());

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
String message = null;
while((message = br.readLine())!=null){
//查看是不是私聊
if(message.startsWith("\\")){
/*
* 私聊格式:\昵称:内容
*/
//找到":"的位置
int index = message.indexOf(":");
//截取昵称
String name = message.substring(1,index);
String info = message.substring(index+1);
info = name+"对你说:"+info;
sendMessageToOne(name,info);
//发送完私聊后就不再进行广播了。
continue;
}
sendMessage(nickName+"说:"+message);
}
}catch(Exception e){
//注释掉后客户端下线不会报异常。
//e.printStackTrace();
}finally{
removeOut(nickName);
sendMessage(nickName+"下线了!");
sendMessage("当前在线人数:"+allOut.size());
if(socket!=null){
try{
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
private String getNickName()throws Exception{
try{
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
String nickName = br.readLine();
while(true){
if(nickName.trim().equals("")){
pw.println("FAIL");
}
if(allOut.containsKey(nickName)){
pw.println("FAIL");
}else{
pw.println("OK");
return nickName;
}
nickName = br.readLine();
}
}catch(Exception e){
throw e;
}
}
}
public void start(){
try{
while(true){
System.out.println("等待客户端连接。。。");
Socket socket = serverSocket.accept();
System.out.println("客户端已连接");
ClientHandler hanlder = new ClientHandler(socket);
threadPool.execute(hanlder);
}
}catch(Exception e){
e.printStackTrace();
}
}
}

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
* 客户端
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
Client client = new Client();
client.start();
}
private Socket socket;
public Client(){
try {
socket = new Socket("localhost",8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
Scanner scan = new Scanner(System.in);
try {
inputNickName(scan);
ServerHandler handler = new ServerHandler();
Thread t = new Thread(handler);
t.setDaemon(true);
t.start();

PrintWriter pw = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
while(true){
pw.println(scan.nextLine());
}
} catch (Exception e){
//注释掉后客户端下线不会报异常
//e.printStackTrace();
}finally{
if(socket!=null){
try{
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
class ServerHandler implements Runnable{
public void run(){
try{
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream(),"utf-8"));
String message;
while((message=br.readLine())!=null){
System.out.println(message);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
private void inputNickName(Scanner scan)throws Exception{
String nickName = null;
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(),"utf-8"),true);
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream(),"utf-8"));
while(true){
System.out.println("请输入昵称:");
nickName = scan.nextLine();
if(nickName.trim().equals("")){
System.out.println("昵称不能为空!");
}else{
pw.println(nickName);
String pass = br.readLine();
if(pass!=null&&!"OK".equals(pass)){
System.out.println("昵称已被占用!");
}else{
System.out.println("你好!"+nickName+"开始聊天吧!");
break;
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息