1 Star 0 Fork 0

乔之恒 / Talk

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Talk_server.java 8.67 KB
一键复制 编辑 原始数据 按行查看 历史
乔之恒 提交于 2021-02-20 23:14 . update Talk_server.java.
package Talk;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class Talk_server {
public String user_name;
public static String server_host = "127.0.0.1";
public mPortListener[] mListener= new mPortListener[5];
public Socket[] msender = new Socket[5];
public BlockingQueue<message> msg=new ArrayBlockingQueue<message>(20);
public Scanner in= new Scanner(System.in);
public static final String[] keywords={
"->create","->join","->getip","->exit"
};
public Talk_server(String name) {
user_name=name;
}
public String print_mess(message m) {
return "["+m.uname+"] "+m.mess;
}
public int create_room(String room_name) throws IOException{
command coom = new command(this);
coom.start();
for(int i=0;i<5;i++) {
mListener[i] = new mPortListener(this,i+8080,false);
}
for(int i=0;i<5;i++) {
mListener[i].start();
}
mPortListener mscanner = new mPortListener(this,0,true);
mscanner.start();
while(true) {
if(msg.size()!=0) {
message mes = msg.remove();
if(mes.uname=="000") {
mscanner.exit_b=true;
for(int i=0;i<5;i++) {
if(msender[i]!=null) {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(msender[i].getOutputStream())
);
bw.write("->request_exit"+'\n');
bw.flush();
}
if(mListener[i]!=null) mListener[i].exit_b=true;
mListener[i] = null;
if(msender[i]!=null) msender[i].close();
msender[i]=null;
}
System.out.println(print_mess(new message("SYSTEM","Í˳ö·¿¼ä")));
coom.exit_b=true;
return 0;
}
System.out.println(print_mess(mes));
for(int i=0;i<5;i++) {
if(msender[i]==null) continue;
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(msender[i].getOutputStream())
);
bw.write(print_mess(mes)+'\n');
bw.flush();
}
}
}
}
public String get_selfip() {
InetAddress ia=null;
try {
ia=ia.getLocalHost();
String localip=ia.getHostAddress();
return localip;
} catch (Exception e) {}
return null;
}
public void password_test(String password) {
return;
}
public int connect(String room_name) throws IOException {
mconnectListener lin_Listener = new mconnectListener(this,10000,room_name);
lin_Listener.start();
Socket comm = new Socket(room_name,12000);
BufferedReader br = new BufferedReader(
new InputStreamReader(comm.getInputStream())
);
String po_lin=br.readLine();
System.out.println(po_lin);
int po=po_lin.charAt(0)-'0';
Socket lin_sender = new Socket(room_name,8080+po);
if(lin_sender == null) {
System.out.println("[SYSTEM]:²»ÄÜÁ¬½Ó");
return 1;
}
System.out.println("[SYSTEM]:Òѽ¨Á¢Óë"+room_name+"µÄÁªÏµ");
mPortListener mscanner = new mPortListener(this,0,true);
mscanner.start();
BufferedWriter bw = new BufferedWriter( ///////////////////////////
new OutputStreamWriter(lin_sender.getOutputStream())
);
bw.write(this.user_name+'\n');
bw.flush();
while(true) {
if(lin_Listener.exit_b) {
lin_sender.close();
mscanner.exit_b=true;
System.out.println("[SYSTEM]:¶Ï¿ªÓë"+room_name+"µÄÁªÏµ");
return 0;
}
if(this.msg.size()!=0) {
String mes;
message s=msg.remove();
if(s.uname=="000") {
mes = "->request_exit";
bw.write(mes+'\n');
bw.flush();
} else if(s.uname==this.user_name) {
bw.write(s.mess+'\n');
bw.flush();
} else System.out.println(print_mess(s));
}
}
}
public static void main(String args[]) throws IOException,ConnectException {
String name=null;
for(String e:args) {
name=e;
}
if(name==null) Exit(121);
Talk_server User = new Talk_server(name);
System.out.print("Password:");
User.password_test(User.in.next());
while(true) {
User.in = new Scanner(System.in);
String s=User.in.next();
if(s.equals(keywords[0])) {
User.create_room(User.in.next());
} else if(s.equals(keywords[1])) {
User.connect(User.in.next());
} else if(s.equals(keywords[2])) {
System.out.println(
User.print_mess(new message("SYSTEM","ÄãµÄipΪ:"+User.get_selfip()))
);
} else if(s.equals(keywords[3])) {
System.out.println(
User.print_mess(new message("SYSTEM","Moyu Talk»¶Ó­ÄúÔÙÀ´"))
);
System.exit(0);
}
}
}
private static void Exit(int q) {
System.out.println("Error:"+q);
System.exit(0);
}
}
class mPortListener extends Thread {
public ServerSocket lisobject;
public Talk_server retobject;
public BlockingQueue<message> msg=new ArrayBlockingQueue<message>(20);
private boolean scan_boo;
public Scanner scan;
public int lis_port;
public boolean avail=false;
public boolean exit_b=false;
public mPortListener(Talk_server t,int port,boolean boo) throws IOException {
this.retobject = t;
if(boo==false) this.lisobject = new ServerSocket(port);
this.scan_boo = boo;
if(boo) this.scan = t.in;
this.lis_port=port;
}
public void run() {
try {
if(scan_boo) {
while(true) {
if(exit_b) return;
String s = this.scan.next();
if(s.equals("->request_exit")) {
this.retobject.msg.offer(new message("000","exit"));
return;
}
this.retobject.msg.offer(new message(this.retobject.user_name,s));
}
}
Socket so = lisobject.accept();
this.avail=true;
lisobject.close();
System.out.println("[DEBUG]");
int index=-1;
for(int i=0;i<5;i++) {
if(this.retobject.msender[i]==null) {
index=i;break;
}
}
System.out.println(index+" "+so.getInetAddress().getHostAddress());
this.retobject.msender[index] =
new Socket(so.getInetAddress().getHostAddress(),10000);
BufferedReader br = new BufferedReader(
new InputStreamReader(so.getInputStream())
);
String name=br.readLine();
System.out.println("[SYSTEM]:"+name+"¼ÓÈë·¿¼ä");
while(true) {
String s = br.readLine();
if(exit_b || s==null) {
this.lisobject.close();
this.lisobject=null;
return;
}
if(s.equals("->request_exit")) {
this.retobject.msender[index].close();
this.retobject.msender[index] = null;
so.close();
this.lisobject = new ServerSocket(this.lis_port);
this.avail=false;
run();return;
}
this.retobject.msg.offer(new message(name,s));
}
} catch(IOException e) {Exit(194);}
}
private static void Exit(int q) {
System.out.println("Error:"+q);
System.exit(0);
}
}
class mconnectListener extends Thread {
public ServerSocket lisobject;
public Talk_server retobject;
public String room_name;
public boolean exit_b=false;
public mconnectListener(Talk_server t,int port,String roomname) throws IOException {
this.retobject = t;
this.lisobject = new ServerSocket(port);
this.room_name = roomname;
}
public void run() {
try {
Socket so = this.lisobject.accept();
BufferedReader br = new BufferedReader(
new InputStreamReader(so.getInputStream())
);
while(true) {
if(exit_b) {
this.lisobject.close();
return;
}
String s=br.readLine();
if(s==null || s.equals("->request_exit")) {
this.exit_b=true;
}
else this.retobject.msg.offer(new message(room_name,s)); //////fan
}
} catch(IOException e) {Exit(224);}
}
private static void Exit(int q) {
System.out.println("Error:"+q);
System.exit(0);
}
}
class command extends Thread { // port 12000
public Talk_server retobject;
public ServerSocket lisobject;
public boolean exit_b=false;
public command(Talk_server t) throws IOException {
this.retobject=t;
this.lisobject = new ServerSocket(12000);
}
public void run() {
try {
while(true) {
if(this.exit_b) return;
Socket so=this.lisobject.accept();
for(int i=0;i<5;i++) {
if(this.retobject.mListener[i].avail==false) {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(so.getOutputStream())
);
bw.write(i+"\n");
bw.flush();
}
}
so.close();
}
} catch(IOException e) {}
}
}
class message {
String uname;
String mess;
public message(String s_1,String s_2) {
uname=s_1;mess=s_2;
}
}
Java
1
https://gitee.com/qiao_zhi_heng/talk.git
git@gitee.com:qiao_zhi_heng/talk.git
qiao_zhi_heng
talk
Talk
master

搜索帮助