package cn.com.dnyy.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
public class Client {
private Socket linkServerSocket;
private BufferedReader br;
private PrintWriter pw;
private BufferedReader ubr = null;
private String userName = null;
private boolean flag = true;
private List<String> onlineUserName;
private List<String> sendToList;
public static void main(String[] args) {
new Client().startUp();
}
private void startUp(){
try {
linkServerSocket = new Socket("127.0.0.1", 8888);
ubr = new BufferedReader(new InputStreamReader(System.in));
br = new BufferedReader(new InputStreamReader(linkServerSocket.getInputStream()));
pw = new PrintWriter(linkServerSocket.getOutputStream(), true);
onlineUserName = new ArrayList<String>();
sendToList = new ArrayList<String>();
System.out.println("连接服务器通信正常!");
System.out.println("=========请输入您的用户名:=========");
userName = ubr.readLine();
pw.println(userName);
System.out.println("=========我们欢迎您的到来!=========");
System.out.println("输入\"-M\"显示菜单功能提示");
System.out.println("输入消息并按回车键进行消息发送");
System.out.println("=========预祝您使用愉快!!=========");
new Thread(new ReceiveMessage()).start();
String str = null;
while ((str = ubr.readLine()) != null) {
if(!flag) break;
if("-M".equals(str)){
showMainMenu();
}else if("-U".equals(str)){
showUserList();
}else if("-Q".equals(str)){
pw.println(KeyWords.CLIENT_CLOSE_POST);
}else if("-A".equals(str)){
sendToList.clear();
sendToList.add("所有人");
}else if("-I".equals(str)){
showReceiverList();
}else if(str.startsWith("-S,")){
String tempAddName = str.substring(str.indexOf(",") + 1);
if(onlineUserName.contains(tempAddName)) {
sendToList.add(tempAddName);
System.out.println("接收人[" + tempAddName + "]添加成功!");
if(sendToList.contains("所有人")) sendToList.remove("所有人");
}
}else{
StringBuilder sendTo = new StringBuilder(KeyWords.SEND_TO_TARGET_START);
if(sendToList.size() < 1){
sendToList.add("所有人");
}
for (int i = 0; i < sendToList.size(); i++) {
if(i < sendToList.size() - 1){
sendTo.append(sendToList.get(i)+",");
}else{
sendTo.append(sendToList.get(i));
}
}
sendTo.append(KeyWords.SEND_TO_TARGET_END+str);
pw.println(sendTo);
}
}
} catch (SocketException e){
flag = false;
System.out.println("服务器正在维护中!请稍后重试登陆!");
System.out.println("=========请按回车关闭程序!=========");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(linkServerSocket != null) linkServerSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(ubr != null) ubr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void showMainMenu() {
System.out.println("======================================");
System.out.println("=|[-U]用户列表|[-I]接收人列表|[-Q]安全退出|=");
}
private void showUserList() {
StringBuilder sb = new StringBuilder("==============用户列表=============");
sb.append("\n");
for(int i = 0; i < onlineUserName.size(); i++){
sb.append(onlineUserName.get(i));
sb.append("\n");
}
sb.append("=================================");
sb.append("输入\"-A\"清空接收人并设置为发送给所有人\n");
sb.append("输入\"-S,接收人昵称\"添加消息接收人");
System.out.println(sb);
}
private void showReceiverList() {
StringBuilder sb = new StringBuilder("==============接收列表=============");
sb.append("\n");
for(int i = 0; i < sendToList.size(); i++){
sb.append(sendToList.get(i));
sb.append("\n");
}
sb.append("=================================");
sb.append("输入\"-A\"清空接收人并设置为发送给所有人\n");
sb.append("输入\"-S,接收人昵称\"添加消息接收人");
System.out.println(sb);
}
private void receive() {
try {
String str = br.readLine();
if(str.equals(KeyWords.CLIENT_CLOSE_POST_RETURN)){
flag = false;
System.out.println("=========请按回车关闭程序!=========");
return;
} else if(str.startsWith(KeyWords.ONLINE_CLIENTS_LIST)){
onlineUserName.clear();
String[] tempUserNameList = str.substring(KeyWords.ONLINE_CLIENTS_LIST.length()).split(",");
for(String item : tempUserNameList){
onlineUserName.add(item);
}
for(int i = 0; i < sendToList.size(); i++){
if(!onlineUserName.contains(sendToList.get(i))) sendToList.remove(i);
}
if(sendToList.size() < 1){
sendToList.add("所有人");
}
} else {
System.out.println(str);
}
} catch (SocketException e){
flag = false;
System.out.println("服务器正在维护中!请稍后重试登陆!");
System.out.println("=========请按回车关闭程序!=========");
} catch (IOException e) {
e.printStackTrace();
}
}
private class ReceiveMessage implements Runnable {
@Override
public void run() {
while(true){
if(!flag) break;
receive();
}
}
}
}