服务端
-
import java.io.*;
-
import java.net.*;
-
import java.util.ArrayList;
-
public class Server{
-
public static ServerSocket server_socket;
-
public static ArrayList<Socket> socketList=new ArrayList<Socket>();
-
public static void main(String []args){
-
try{
-
server_socket = new ServerSocket(5000);
-
while(true){
-
Socket socket = server_socket.accept();
-
socketList.add(socket); //把sock对象加入sock集合
-
ServerBO_Thread st=new ServerBO_Thread(socket,socketList); //初始化多线程
-
st.start();//启动多线程
-
}
-
}catch(Exception ex){
-
ex.printStackTrace();
-
}finally{
-
try{
-
if(server_socket!=null){
-
server_socket.close();
-
}
-
}catch(Exception ex){
-
ex.printStackTrace();
-
}
-
}
-
}
-
public void encryptWrite(String src,DataOutputStream output)throws IOException{
-
//将一个字符串转化为字符数组
-
//System.out.println(src);
-
char[] char_arr = src.toCharArray();
-
//加密操作
-
for(int i = 0;i<char_arr.length;i++){
-
output.writeChar(char_arr[i]+13);
-
}
-
//用作结束标志符
-
output.writeChar(2333);
-
output.flush();
-
}
-
//读取并解密
-
public String readDecrypt(DataInputStream input)throws IOException{
-
String rtn="";
-
while(true){
-
int char_src =input.readChar();
-
if(char_src!=2333){
-
rtn=rtn+(char)(char_src-13);
-
}else{
-
break;
-
}
-
}
-
return rtn;
-
}
-
}
-
class ServerBO_Thread extends Thread{
-
Socket client = null;
-
ArrayList<Socket> clients;
-
ServerBO_Thread(Socket s,ArrayList<Socket> ss){//初始化
-
client=s;
-
clients=ss;
-
}
-
public void run(){
-
DataInputStream input = null;
-
DataOutputStream output =null;
-
try{
-
input = new DataInputStream(client.getInputStream());
-
Server bo = new Server();
-
String receive=null;
-
String send=null;
-
while(true){//监视当前客户端有没有发来消息
-
if(!client.isClosed()){
-
receive=bo.readDecrypt(input);
-
clients.trimToSize();
-
String[] param = receive.split("&");
-
if(")start".equals(param[1])){ //分析客户端发来的内容
-
send = param[0]+"进入聊天室";
-
}else{
-
send = param[0]+"说: "+param[1];
-
}
-
if(!("3333".equals(param[1]))){//3333为退出聊天室信号
-
for(Socket socket:clients){ //遍历socke集合
-
//把读取到的消息发送给各个客户端
-
if(!socket.isClosed()){
-
output = new DataOutputStream(socket.getOutputStream());
-
bo.encryptWrite(send,output);
-
}
-
}
-
}else{//如果有客户端退出
-
for(Socket socket:clients){ //遍历socke集合
-
if(socket!=client){//告诉其他人此人退出聊天室
-
if(!(socket.isClosed())){
-
output = new DataOutputStream(socket.getOutputStream());
-
bo.encryptWrite(param[0]+"已退出聊天室",output);
-
}
-
}
-
}
-
output = new DataOutputStream(client.getOutputStream());
-
bo.encryptWrite("3333",output);//返回信号给要退出的客户端,然后关闭线程
-
client.close();
-
input.close();
-
output.close();
-
}
-
}else{
-
break;
-
}
-
}
-
}catch(Exception ex){
-
ex.printStackTrace();
-
}
-
}
-
}
客户端
-
import java.io.IOException;
-
import java.util.Scanner;
-
import java.net.*;
-
import java.io.*;
-
import java.io.InputStreamReader;
-
import java.io.OutputStreamWriter;
-
import java.io.BufferedWriter;
-
import java.io.BufferedReader;
-
import java.io.DataOutputStream;
-
public class People{
-
//服务端ip
-
public String ip = "127.0.0.1";
-
//服务端端口
-
public int port = 5000;
-
public DataOutputStream output = null;
-
public Socket socket = null;
-
public DataInputStream input = null;
-
public Scanner sc =new Scanner (System.in);
-
public String send ;
-
public String receive;
-
public String name;
-
public String sd = null;
-
public static void main(String[]aa){
-
People po = new People();
-
po.start();
-
}
-
public void start(){
-
try{
-
System.out.println("*******欢迎使用匿名聊天室!**********");
-
System.out.println("请输入你将要使用的昵称:");
-
name=sc.nextLine();//获取昵称
-
socket = new Socket(ip,port);
-
output=new DataOutputStream(socket.getOutputStream());
-
input = new DataInputStream(socket.getInputStream());
-
send = name+"&)start";//把昵称发送到server 告诉所有人有新成员加入聊天室
-
System.out.println("(如果要退出聊天室请输入“3333”!)");
-
System.out.println("*******成功进入匿名聊天室!**********");
-
System.out.println("");
-
encryptWrite(send,output);
-
Out out=new Out(output,name,input,socket);
-
out.start();//启动发送聊天内容的多线程
-
while(true){
-
String receive = readDecrypt(input);
-
if("3333".equals(receive)){//如果收到“3333”则退出聊天室
-
System.out.println("*******成功退出匿名聊天室!**********");
-
input.close();
-
output.close();
-
socket.close();
-
System.exit(0);
-
}
-
System.out.println(receive);
-
}
-
}catch(Exception ex){
-
ex.printStackTrace();
-
}finally{
-
try{
-
if(socket!=null) socket.close();
-
input.close();
-
output.close();
-
}catch(Exception ex){
-
ex.printStackTrace();
-
}
-
}
-
}
-
public void encryptWrite(String src,DataOutputStream output)throws IOException{
-
//将一个字符串转化为字符数组
-
char[] char_arr = src.toCharArray();
-
//加密操作
-
for(int i = 0;i<char_arr.length;i++){
-
output.writeChar(char_arr[i]+13);
-
}
-
//用作结束标志符
-
output.writeChar(2333);
-
output.flush();
-
}
-
//读取并解密
-
public String readDecrypt(DataInputStream input)throws IOException{
-
String rtn="";
-
while(true){
-
int char_src =input.readChar();
-
if(char_src!=2333){
-
rtn=rtn+(char)(char_src-13);
-
}else{
-
break;
-
}
-
}
-
return rtn;
-
}
-
}
-
class Out extends Thread {
-
public DataOutputStream output;
-
public DataInputStream input;
-
public static String name;
-
public Socket socket;
-
public Scanner sc =new Scanner (System.in);
-
Out(DataOutputStream ot,String n,DataInputStream it,Socket socket){
-
output=ot;
-
input=it;
-
name=n;
-
}
-
public void run(){
-
People po = new People();
-
try{
-
while(true){
-
String send=sc.nextLine();//获取用户输入
-
String send2=name+"&"+send;//把聊天内容打包成约定形式
-
po.encryptWrite(send2,output);
-
}
-
}catch(Exception ex){
-
ex.printStackTrace();
-
}finally{
-
System.out.println("sfef");
-
}
-
}
-
}
运行结果如下: