📄 server.java
字号:
//Server.java
import java.io.*;
import java.net.*;
import java.util.*;
import MyPackage.VECTOR;
public class Server extends Thread{
protected int port;
protected ServerSocket listen_socket;
//定义并启动服务器的Socket 例程,监听客户机的连接请求。
public Server(int port){
this.port=port;
try{
listen_socket=new ServerSocket(port);
}
catch(IOException e){}
System.out.println("(信息收发)Server port:listening on port:"+port);
this.start();
}// End of Server
/* 下面为服务器监听线程的主程序。该线程一直循环执行,监听并接受客户机发出的连接
请求。对每一个连接,均产生一个连接对象与之对应,通过Socket 通道进行通信。*/
public void run(){
Socket socket;
try{
while(true){
//从容器中移除已断开连接的socket
for(int j=0;j<VECTOR.vector.size();j++){
A1 a=new A1();
a=(A1)(VECTOR.vector.get(j));
if(a.socket0.isClosed())//返回套接字的关闭状态
VECTOR.vector.remove(j);
}//end of for
Socket client_socket=listen_socket.accept();
//System.out.println("第一次用户名:"+A2.zhh);
A1 a1=new A1();
a1.socket0=client_socket;
a1.user=A2.zhh;
VECTOR.tp.add(a1);
VECTOR.vector.add(a1);
//System.out.println("第二次用户名:"+a1.user);
//System.out.println("输出SOCKET:"+a1.socket0);
System.out.println("接立一个客户端传输连接");
Connected c=new Connected(client_socket);
}
}
catch(IOException e){}
}// End of run
//启动服务器主程序
public static void main(String args[]){
new Server(4700);//信息的收发端口
new User(5700);//注册端口
new Ascends(6700);//登陆端口
new FileRead();//把用已注册的用户从文件中读出来
}//End of the main
}//end of Server class
class Connected extends Thread{
protected Socket client;
protected BufferedReader in;
protected PrintStream out;
public Connected(Socket client_socket){
client=client_socket;
try{
in=new BufferedReader(new InputStreamReader(client.getInputStream()));
out=new PrintStream(client.getOutputStream());
}
catch(IOException e){
try{
client.close();
}
catch(IOException e2){
System.err.println("Exception while getting socket streram:"+e);
}
return;
}
this.start();
}//End of Connection method
// 服务例程:读出一行文本;
public void run(){
String line,line1,user0,user,name;
Socket c;
int i,j,k;
try{
for(;;){
line1=in.readLine();
//System.out.println("原始数据:"+line1);
if(line1==null)break;
line=line1.replace('♀','\n');//将字符串中的所有♀还原成回车符
System.out.println("输出接收到的消息:"+line);
//从容器中移除已断开连接的socket
//System.out.println(VECTOR.vector.size());
for(j=0;j<VECTOR.vector.size();j++){
A1 a=new A1();
a=(A1)(VECTOR.vector.get(j));
c=a.socket0;
if(c.isClosed())//返回套接字的关闭状态
VECTOR.vector.remove(j);
}//end of for
i=line.indexOf(60);//查找"<"的位置
j=line.indexOf(62);//查找">"的位置
k=line.lastIndexOf(62);//查找">"最后一次出现的位置
// System.out.println("i="+i+"j="+j);
// System.out.println(VECTOR.vector.size());
user0=line.substring(0,j);//从消息队列中取出源用户
user=line.substring(i+1,k);//从消息队列中取出目的用户
// System.out.println("User0:"+user0);
//System.out.println("User:"+user);
System.out.println("当前私聊的用户数:"+VECTOR.temp.size());
if(user.equals("Everybody")){//判断是私聊还是群聊
//判断私聊的用户是否已经取消私聊
for(i=0;i<VECTOR.temp.size();i++){
String a=(String)(VECTOR.temp.get(i));
if(user0.equals(a))
VECTOR.temp.remove(i);
}
for(i=0;i<VECTOR.vector.size();i++){
boolean flag1=false;
A1 a1=new A1();
a1=(A1)(VECTOR.vector.get(i));
c=a1.socket0;
//判断此用户是否在进行私聊
for(j=0;j<VECTOR.temp.size();j++){
String p=(String)VECTOR.temp.get(j);
if(p.equals(a1.user)){
flag1=true;
break;
}
}
if(flag1)
continue;
//判断程序段结束*/
out=new PrintStream(c.getOutputStream());
out.println(line);
out.flush();
}
}
else{
boolean flag2=false;//标记当前用户是否在已经建立连接有用户的队列中
for(i=0;i<VECTOR.vector.size();i++){
A1 a2=new A1();
a2=(A1)(VECTOR.vector.get(i));
c=a2.socket0;
if(user.equals(a2.user)){
flag2=true;
break;
}
}
if(!flag2){
out.println("※♂℉〒á☆");
}
else{
boolean flag3=true;//标记当前用户是否在私聊用户队列中true表示"不在",false表示"在"
for(i=0;i<VECTOR.temp.size();i++){
String tt=(String)VECTOR.temp.get(i);
if(tt.equals(user0)){
flag3=false;
break;
}
}
if(flag3)
VECTOR.temp.add(user0);//加当前用户加到私聊队列中去
for(i=0;i<VECTOR.vector.size();i++){
A1 a1=new A1();
a1=(A1)(VECTOR.vector.get(i));
c=a1.socket0;
name=a1.user;
if(name.equals(user)||name.equals(user0)){
out=new PrintStream(c.getOutputStream());
out.println(line);
out.flush();
}
}
}
}
}
}
catch(IOException e){}
finally{
try{
client.close();
}
catch(IOException e2){}
System.out.println("此线程结束");
}
}//End of run method
}//End of connected class
//注册用户
class User extends Thread{
BufferedReader is;
PrintWriter os;
ServerSocket s;
Socket c;
User(int port){
try{
s=new ServerSocket(port);
System.out.println("(用户注册)Server port:listening on port:"+port);
}catch(Exception e){
System.out.println("shuermao"+e);
return;
}
this.start();
}
public void run(){
while(true){
try{
c=s.accept();
System.out.println("用户注册建立一个新连接...");
new conn(c);
}catch(Exception e){}
}
}
}
class conn extends Thread{
BufferedReader is;
PrintWriter os;
Socket c;
public conn(Socket s){
c=s;
try{
os=new PrintWriter(c.getOutputStream());
is=new BufferedReader(new InputStreamReader(c.getInputStream()));
}catch(Exception e){
try{
c.close();
}catch(Exception e1){}
return;
}
this.start();
}
public void run(){
String s1,s2,s3,s4;
int i,j,k;
//System.out.println("flag");
while(true){
try{
s1=is.readLine();
// System.out.println("MIJIANMEI!"+s1);
if(s1==null)break;
i=s1.indexOf(58);//返回":"第一次出现的位置
j=s1.lastIndexOf(58);//返回":"最后一次出现的位置
s2=s1.substring(0,i);//取出用户名
s3=s1.substring(i+1,j);//取出密码
s4=s1.substring(j+1,s1.length());//取出确认密码
Judge judge=new Judge();
if(s2.length()<1|s2.length()>10|!judge.function1(s2)){
System.out.println("用户名非法");
new B(c,"2");
}
else if(!s3.equals(s4)|s3.length()<1|s3.length()>6|!judge.function2(s3)){
System.out.println("密码非法");
new B(c,"3");
}
else{
for(j=0;j<VECTOR.user.size();j++){//判断此用户是否已经存在
A a=new A();
a=(A)(VECTOR.user.get(j));
if(s2.equals(a.name)){
// System.out.println("name="+a.name+" S2="+s2);
System.out.println("此用户已经存在");
new B(c,"1");
break;
}
}
if(j==VECTOR.user.size()){//此用户已经存在
A arr=new A();
arr.name=s2;
arr.key=s3;
new FileWrite(s2+":"+s3);
VECTOR.user.add(arr);
new B(c,"0");//表示是一个新用户
System.out.println("新用户添加成功!");
}
}
}catch(Exception e){}
}
}
}//用户注册结束
//用户登陆
class Ascends extends Thread{
BufferedReader is;
PrintWriter os;
ServerSocket s;
Socket c;
Ascends(int port){
try{
s=new ServerSocket(port);
System.out.println("(用户登陆)Server port:listening on port:"+port);
}catch(Exception e){
System.out.println("shuermao"+e);
return;
}
this.start();
}
public void run(){
while(true){
try{
c=s.accept();//for
for(int i=0;i<VECTOR.tp.size();i++){
A1 t=(A1)VECTOR.tp.get(i);
if(t.socket0.isClosed())
VECTOR.tp.remove(i);
}//endfor
System.out.println("用户登陆建立一个新连接...");
new connection(c);
}catch(Exception e){}
}
}
}
class connection extends Thread{
BufferedReader is;
PrintWriter os;
Socket c;
public connection(Socket s){
c=s;
try{
os=new PrintWriter(c.getOutputStream());
is=new BufferedReader(new InputStreamReader(c.getInputStream()));
}catch(Exception e){
try{
System.out.println("异常2:"+e);
c.close();
}catch(Exception e1){System.out.println("异常3:"+e1);}
return;
}
this.start();
}
public void run(){
String s1,s2,s3;
int i,j;
while(true){
try{
s1=is.readLine();
if(s1==null)break;
i=s1.indexOf(58);//返回":"第一次出现的位置
s2=s1.substring(0,i);//取出用户名
s3=s1.substring(i+1,s1.length());//取出密码
boolean flag=true;//标记当前用户名或密码错误
for(j=0;j<VECTOR.user.size();j++){//判断此用户是否是注册用户
A a=new A();
a=(A)(VECTOR.user.get(j));
if(s2.equals(a.name)&&s3.equals(a.key)){
// System.out.println("用户名和密码正确!");
A2.zhh=s2;
boolean flag1=true;//用来标记当前用户尚未登陆
for(i=0;i<VECTOR.tp.size();i++){
A1 p=(A1)VECTOR.tp.get(i);
if(s2.equals(p.user)){
flag1=false;//标记当前用户已经登陆
break;
}
}
if(flag1){//
new B(c,"1");//返回1表示正常登陆
}
else{
new B(c,"2");//返回2表示该用户已经在线
}
flag=false;
break;
}
}
if(flag){
// System.out.println("用户名或密码错误");
new B(c,"0");
}
/* for(int k=0;i<VECTOR.tp.size();i++){
A1 t=(A1)VECTOR.tp.get(i);
if(t.socket0.isClosed())
VECTOR.tp.remove(i);
}//endfor*/
}catch(Exception e){
try{
c.close();
}catch(Exception e1){System.out.println("异常4:"+e1);}
System.out.println("异常5:"+e);
break;
}
}
}
}//用户登陆结束
class B{//发送
public B(Socket c,String s){
try{
PrintWriter os=new PrintWriter(c.getOutputStream());
os.println(s);
os.flush();
}catch(IOException e){
System.out.println("Error"+e);
}
}
}
class A{//user容器中的内容
public String name;
public String key;
};
class A1{
public Socket socket0;
public String user;
};
class A2{
public static String zhh;
};
class FileWrite
{
public FileWrite(String s){
try{
File f=new File("user.txt");
FileWriter fw=new FileWriter(f,true);
fw.write(s,0,s.length());
fw.write("\r\n");//输入一个回车换行符
fw.flush();
fw.close();
}
catch(IOException e){}
}
}
class FileRead
{
public FileRead(){
int i;
String s,s1,s2;
try{
RandomAccessFile raf=new RandomAccessFile("user.txt","rw");
while((s=raf.readLine())!=null){
i=s.indexOf(58);//查找:在字符串中的位置
s1=s.substring(0,i);
s2=s.substring(i+1,s.length());
A arr=new A();
arr.name=s1;
arr.key=s2;
VECTOR.user.add(arr);//在容器中增加一项
}
raf.close();
}
catch(Exception e){}
}
}
//判断用户名或密码是否合法,用户名由1到10个字母组成,密码由1到6个数字组成
class Judge{
public boolean function1(String s){//判断是否是字母字符串
int i;
char txt[]=s.toCharArray();
for(i=0;i<txt.length;i++){
if(txt[i]<'A'||txt[i]>'Z'&&txt[i]<'a'||txt[i]>'z')
return false;
}
return true;
}
public boolean function2(String s){//判断是否是数字字符串
int i;
char txt[]=s.toCharArray();
for(i=0;i<txt.length;i++){
if(txt[i]<'0'||txt[i]>'9')
return false;
}
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -