在公司没聊天工具,为了方便与同事即时联系,写了此程序。
已有很多注释,就不做多解释了。
Main.java
- /**
- * 主入口
- * @author xKF24276 ruilin.xie
- *
- */
- public class Main {
- //程序主入口
- public static void main(String[] args)
- {
- //实例服务端
- Services s = new Services();
- //设置服务端监听端口
- s.open(88);
- //开始监听
- s.start();
- }
- }
/**
* 主入口
* @author xKF24276 ruilin.xie
*
*/
public class Main {
//程序主入口
public static void main(String[] args)
{
//实例服务端
Services s = new Services();
//设置服务端监听端口
s.open(88);
//开始监听
s.start();
}
}
Services.java
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.OutputStreamWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 服务
- *
- * @author xKF24276 ruilin.xie
- *
- */
- public class Services extends Thread
- {
- // 用于存放所有用户的集合
- public static List<UserInfo> allUser = new ArrayList<UserInfo>();
- // 服务器开启端口
- private int port = 80;
- // 设置服务器监听端口
- public void open(int port)
- {
- this.port = port;
- }
- // 主线程,用于监听用户上线
- public void run()
- {
- System.out.println("聊天室服务端启动成功,正在监听用户登录信息...");
- // 服务端
- ServerSocket srvSocket = null;
- // 客户端套接字
- Socket client = null;
- // 客户端输出流
- OutputStream out = null;
- // 客户端输入流
- InputStream in = null;
- // 用户名字
- String yourname = null;
- try
- {
- // 打开服务
- srvSocket = new ServerSocket(port);
- } catch (IOException e) {
- e.printStackTrace();
- }
- while (true)
- {
- try
- {
- // 休眠0.5s
- Thread.sleep(500);
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
- try
- {
- // 等待客户机登录
- client = srvSocket.accept();
- out = client.getOutputStream();
- // 发送欢迎信息
- OutputStreamWriter writer = new OutputStreamWriter(out);
- writer.write("/t/tWelcome ! /r/nInput YourName : ");
- writer.flush();
- // 获取用户输入用户名
- in = client.getInputStream();
- InputStreamReader inreader = new InputStreamReader(in);
- BufferedReader reader = new BufferedReader(inreader);
- yourname = reader.readLine();
- // 初始化用户信息
- UserInfo uinfo = new UserInfo();
- uinfo.setClient(client);
- uinfo.setUip(client.getInetAddress().getHostAddress());
- if (yourname != null)
- {
- yourname = checkYourName(yourname);
- uinfo.setUname(yourname);
- // 用户存入集合
- allUser.add(uinfo);
- System.out.println("〖系统消息:" + yourname + " 上线 !〗");
- // 发送提示登录成功
- writer.write("〖系统消息: Login Success, OnLine Count : "
- + allUser.size() + "〗/r/n");
- writer.flush();
- // 启动该用户监听线程
- SrvBuss sb = new SrvBuss();
- // 设置用户信息
- sb.setUserInfo(uinfo);
- sb.start();
- // 向其他用户提示有用户上线
- sb.sendAllMsg("〖系统消息: " + yourname + " 上线 !〗/r/n");
- }
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
- // 用户如果存在,那么给新用户新标识
- public String checkYourName(String uname)
- {
- for (int i = 0; i < allUser.size(); i++)
- {
- UserInfo uinfo = allUser.get(i);
- if (uinfo.getUname().equals(uname.trim()))
- {
- return uname + "_" + StrUtil.NumStr(5);
- }
- }
- return uname;
- }
- }
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 服务
*
* @author xKF24276 ruilin.xie
*
*/
public class Services extends Thread
{
// 用于存放所有用户的集合
public static List<UserInfo> allUser = new ArrayList<UserInfo>();
// 服务器开启端口
private int port = 80;
// 设置服务器监听端口
public void open(int port)
{
this.port = port;
}
// 主线程,用于监听用户上线
public void run()
{
System.out.println("聊天室服务端启动成功,正在监听用户登录信息...");
// 服务端
ServerSocket srvSocket = null;
// 客户端套接字
Socket client = null;
// 客户端输出流
OutputStream out = null;
// 客户端输入流
InputStream in = null;
// 用户名字
String yourname = null;
try
{
// 打开服务
srvSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
while (true)
{
try
{
// 休眠0.5s
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try
{
// 等待客户机登录
client = srvSocket.accept();
out = client.getOutputStream();
// 发送欢迎信息
OutputStreamWriter writer = new OutputStreamWriter(out);
writer.write("/t/tWelcome ! /r/nInput YourName : ");
writer.flush();
// 获取用户输入用户名
in = client.getInputStream();
InputStreamReader inreader = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(inreader);
yourname = reader.readLine();
// 初始化用户信息
UserInfo uinfo = new UserInfo();
uinfo.setClient(client);
uinfo.setUip(client.getInetAddress().getHostAddress());
if (yourname != null)
{
yourname = checkYourName(yourname);
uinfo.setUname(yourname);
// 用户存入集合
allUser.add(uinfo);
System.out.println("〖系统消息:" + yourname + " 上线 !〗");
// 发送提示登录成功
writer.write("〖系统消息: Login Success, OnLine Count : "
+ allUser.size() + "〗/r/n");
writer.flush();
// 启动该用户监听线程
SrvBuss sb = new SrvBuss();
// 设置用户信息
sb.setUserInfo(uinfo);
sb.start();
// 向其他用户提示有用户上线
sb.sendAllMsg("〖系统消息: " + yourname + " 上线 !〗/r/n");
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
// 用户如果存在,那么给新用户新标识
public String checkYourName(String uname)
{
for (int i = 0; i < allUser.size(); i++)
{
UserInfo uinfo = allUser.get(i);
if (uinfo.getUname().equals(uname.trim()))
{
return uname + "_" + StrUtil.NumStr(5);
}
}
return uname;
}
}
SrvBuss.java
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.OutputStreamWriter;
- import java.net.Socket;
- /**
- * 单用户线程处理
- *
- * @author xKF24276 ruilin.xie
- *
- */
- public class SrvBuss extends Thread
- {
- // 登录用户信息
- private UserInfo uinfo = null;
- public void setUserInfo(UserInfo uinfo)
- {
- this.uinfo = uinfo;
- }
- public UserInfo getUserInfo()
- {
- return this.uinfo;
- }
- // 副线程,用于单用户监听
- public void run()
- {
- // 得到单用户信息
- Socket client = uinfo.getClient();
- String line = null;
- while (true)
- {
- try
- {
- // 监控用户是否有输入信息
- InputStream in = client.getInputStream();
- // 如果用户有输入,则获取输入内容
- InputStreamReader inreader = new InputStreamReader(in);
- BufferedReader reader = new BufferedReader(inreader);
- line = reader.readLine();
- // 如果用户关闭聊天窗口
- if (line == null)
- {
- // remove该用户,关闭线程
- removeMyself();
- return;
- }
- // 如果该用户有输入数据,则发送给其他用户
- sendAllMsg("【" + uinfo.getUname() + " " + uinfo.getUip()
- + " 】 Say : " + line + "/r/n");
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
- // 将消息散布
- public void sendAllMsg(String msg) throws IOException
- {
- OutputStream out = null;
- for (int i = 0; i < Services.allUser.size(); i++)
- {
- UserInfo user = Services.allUser.get(i);
- // 如果是自己,则不需发送消息
- if (uinfo.getUname().equals(user.getUname()))
- {
- continue;
- }
- Socket client = user.getClient();
- out = client.getOutputStream();
- OutputStreamWriter writer = new OutputStreamWriter(out);
- writer.write(msg);
- writer.flush();
- }
- }
- // 删除下线用户
- public void removeMyself() throws IOException
- {
- for (int i = 0; i < Services.allUser.size(); i++)
- {
- UserInfo user = Services.allUser.get(i);
- // 如果当前用户关闭聊天窗口
- if (user.getUname().equals(uinfo.getUname()))
- {
- // 向其他用户提示该用户下线
- sendAllMsg("〖系统消息: " + user.getUname() + " 下线 !〗/r/n");
- System.out.println("〖系统消息: " + user.getUname() + " 下线 !〗/r/n");
- // remove当前用户
- Services.allUser.remove(i);
- }
- }
- }
- }
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
/**
* 单用户线程处理
*
* @author xKF24276 ruilin.xie
*
*/
public class SrvBuss extends Thread
{
// 登录用户信息
private UserInfo uinfo = null;
public void setUserInfo(UserInfo uinfo)
{
this.uinfo = uinfo;
}
public UserInfo getUserInfo()
{
return this.uinfo;
}
// 副线程,用于单用户监听
public void run()
{
// 得到单用户信息
Socket client = uinfo.getClient();
String line = null;
while (true)
{
try
{
// 监控用户是否有输入信息
InputStream in = client.getInputStream();
// 如果用户有输入,则获取输入内容
InputStreamReader inreader = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(inreader);
line = reader.readLine();
// 如果用户关闭聊天窗口
if (line == null)
{
// remove该用户,关闭线程
removeMyself();
return;
}
// 如果该用户有输入数据,则发送给其他用户
sendAllMsg("【" + uinfo.getUname() + " " + uinfo.getUip()
+ " 】 Say : " + line + "/r/n");
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
// 将消息散布
public void sendAllMsg(String msg) throws IOException
{
OutputStream out = null;
for (int i = 0; i < Services.allUser.size(); i++)
{
UserInfo user = Services.allUser.get(i);
// 如果是自己,则不需发送消息
if (uinfo.getUname().equals(user.getUname()))
{
continue;
}
Socket client = user.getClient();
out = client.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out);
writer.write(msg);
writer.flush();
}
}
// 删除下线用户
public void removeMyself() throws IOException
{
for (int i = 0; i < Services.allUser.size(); i++)
{
UserInfo user = Services.allUser.get(i);
// 如果当前用户关闭聊天窗口
if (user.getUname().equals(uinfo.getUname()))
{
// 向其他用户提示该用户下线
sendAllMsg("〖系统消息: " + user.getUname() + " 下线 !〗/r/n");
System.out.println("〖系统消息: " + user.getUname() + " 下线 !〗/r/n");
// remove当前用户
Services.allUser.remove(i);
}
}
}
}
StrUtil.java
- import java.util.Random;
- /**
- * 工具类
- *
- * @author xKF24276 ruilin.xie
- *
- */
- public class StrUtil
- {
- public static String NumStr(int length)
- {
- StringBuffer numstr = new StringBuffer();
- char[] cwords = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
- 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
- 'w', 'x', 'y', 'z', 'A', 'B', 'V', 'D', 'E', 'F', 'G', 'H',
- 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
- 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5',
- '6', '7', '8', '9' };
- for (int i = 0; i < length; i++)
- {
- int ran = new Random().nextInt(cwords.length);
- numstr.append(cwords[ran]);
- }
- return numstr.toString();
- }
- }
import java.util.Random;
/**
* 工具类
*
* @author xKF24276 ruilin.xie
*
*/
public class StrUtil
{
public static String NumStr(int length)
{
StringBuffer numstr = new StringBuffer();
char[] cwords = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', 'A', 'B', 'V', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9' };
for (int i = 0; i < length; i++)
{
int ran = new Random().nextInt(cwords.length);
numstr.append(cwords[ran]);
}
return numstr.toString();
}
}
UserInfo.java
- import java.net.Socket;
- /**
- * 用户信息
- *
- * @author xKF24276 ruilin.xie
- *
- */
- public class UserInfo
- {
- // 用户名
- private String uname;
- // 用户IP
- private String uip;
- // 客户端套接字
- private Socket client;
- public String getUname()
- {
- return uname;
- }
- public void setUname(String uname)
- {
- this.uname = uname;
- }
- public String getUip()
- {
- return uip;
- }
- public void setUip(String uip)
- {
- this.uip = uip;
- }
- public Socket getClient()
- {
- return client;
- }
- public void setClient(Socket client)
- {
- this.client = client;
- }
- }