计算机网络实验源码:网络聊天室

 

RoomServer.java

RoomUser.java

Send.java

Receive.java

Utils.java

RoomServer.java

package Server;
​
​
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;
​
public class RoomServer {
    
    
    private static CopyOnWriteArrayList<Channel> all = new CopyOnWriteArrayList<>();
​
    
    public static void main(String[] args) throws IOException {
        System.out.println("---服务器开始工作---\n");
        ServerSocket server = new ServerSocket(8888);
        while (true) {
            Socket client = server.accept();
            System.out.println("\n一个客户端建立了连接");
            Channel c = new Channel(client);
            all.add(c);     
            new Thread(c).start();
        }
    }
    
    
      
    static class Channel implements Runnable {
        private DataInputStream dis;
        private DataOutputStream dos;
        private BufferedReader is; 
        private PrintWriter os ;
        private Socket client;
        private boolean isRunning;
        private String name;
        private int loginflag;
​
        public Channel(Socket client) {
            this.client = client;
            loginflag=0;
            
            try {
                dis = new DataInputStream(client.getInputStream());
                dos = new DataOutputStream(client.getOutputStream());
                is = new BufferedReader(new InputStreamReader(client.getInputStream()));
                os = new PrintWriter(client.getOutputStream());
                isRunning = true;
                // 登录
                while(true)
                {
                    File a = new File("account.txt");
                    BufferedReader login =new BufferedReader(new FileReader(a));
                    String line1 =receive();
                    this.send("服务器: 已输入账号");
​
                    String line2 =receive();
                    this.send("服务器: 已输入密码");
                    
                    
                    String name = "user";
                    String password = "password";
                    int flag = 0;
                    
                    while((name = login.readLine())!=null && (password = login.readLine())!=null)
                    {
                        
                        if(line1.equals(name) && line2.equals(password))
                        {
​
                        this.send("trueMember");
                        System.out.println("用户"+name+"已登陆");
                        flag=1;
                        this.name=name;
                        break;
                        }
                        
                    }
                    if(flag==0)
                    {
​
                        this.send("wrong!");
                        login.close();
                    }
                    else
                    {
                        loginflag=1;
                        login.close();
                        break;
                    }
                }
                
                sendOthers(this.name + "加入群聊", true);
            } catch (IOException e) {
                System.out.println("---登录时出现问题---"+e);
                release();
            }
        }
        
        
        private String receive() {
            String msg = "";     // 避免空指针
            try {
                //msg = is.readLine();
                msg = dis.readUTF();
                //msg=dis.readFully(b);
                //msg = dis.readLine();
            } catch (IOException e) {
                if(isRunning==true)
                System.out.println("---接受消息出现问题---"+e);
                release();
                isRunning=false;
            }
            return msg;
        }
        
        
        private void send(String msg) {
            try {
                //os.println(msg);
                //os.flush();
                dos.writeUTF(msg);
                dos.flush();
            } catch (IOException e) {
                if(isRunning==true)
                System.out.println("---发送消息出现问题---");
                release();
                isRunning=false;
            }
        }
        
        
        private void sendOthers(String msg, boolean isSys) {
            boolean isPrivate = msg.startsWith("@");
            if (isPrivate) 
            { // 私聊
                int index = msg.indexOf(":");       // 第一次冒号出现的位置
                if(index>=0)
                {
                    // 获取目标和数据
                    String targetName = msg.substring(1, index);
                    msg = msg.substring(index+1);
                    //System.out.println(this.name+" "+targetName+""+msg);
                    for (Channel other: all) {
                        if (other.name.equals(targetName)) { // 目标
                            System.out.println(this.name+"对"+targetName+"的私信:"+msg);
                            other.send(this.name + "对您说悄悄话: " + msg);  // 群聊消息
                        }
                    }
                }
            } 
            else {
                if (!isSys)
                System.out.println(this.name+":"+msg);
                for (Channel other : all) {
                    if (other == this) {
                        continue;
                    }
                    if (!isSys) {
                        other.send(this.name + ": " + msg);  // 群聊消息
                    } else {
                        other.send("系统消息:" + msg);    // 系统消息
                    }
                }
            }
        }
        
        
        private void fileupload()
        {
            
                try
                {
                    String filename = receive();
                    long fileLength = dis.readLong();
 
                     
                     File file = new File(filename);
                     FileOutputStream fos = new FileOutputStream(file);
                     
                     
                     byte[] bytes = new byte[1024];
                     int length = 0;
                     long progress = 0;
                     int percent=0;
                     int per_last=-1;
                     System.out.println("======== 开始接收"+this.name+"发送给服务器的文件:"+filename+" ========");
                     while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                         fos.write(bytes, 0, length);
                         fos.flush();
                         
                         progress += length;
                         percent=(int)(100*progress/fileLength);
                         if(percent!=per_last)
                         System.out.print("| " + percent + "% |");
                         if(percent%10==0 && percent!=0 && percent!=per_last)
                            System.out.print("\n"); 
                         per_last=percent;
                         
                         if(percent>=100)
                             break;
                     }
​
                     System.out.println("======== "+this.name+"上传了文件:"+filename+" ========"); 
                }
                catch(IOException e)
                {
                    System.out.println("========文件上传时异常========"+e);
                }
​
            return;
            
            
        }
        
        
        private void filedownload()
        {
            try
            {
                String filename = receive();
                
​
//              File directory = new File("transport_file");
//              if(!directory.exists()) {
//                    directory.mkdir();
//                }
//              File file = new File(directory.getAbsolutePath()+File.separatorChar+filename);
//              //System.out.println("路径:"+directory.getAbsolutePath() + File.separatorChar + filename); 
                
                File file = new File(filename);
                long fileLength=file.length();
                
                 if(file.exists())
                    {
                        send("filedownload");
                        send(filename);
                        dos.writeLong(fileLength);
                        dos.flush();
                        
                        FileInputStream fis = new FileInputStream(filename);
                       
​
                        byte[] bytes = new byte[1024];
                        int length = 0;
                        long progress = 0;
                        int percent=0;
                        int per_last=-1;
                        System.out.println("======== 开始向"+this.name+"发送服务器文件:"+filename+" ========");
                        while((length = fis.read(bytes, 0, bytes.length)) != -1) {
                            dos.write(bytes, 0, length);
                            dos.flush();
                            
                            progress += length;
                            percent=(int)(100*progress/fileLength);
                            if(percent!=per_last)
                            System.out.print("| " + percent + "% |");
                            if(percent%10==0 && percent!=0 && percent!=per_last)
                                System.out.print("\n"); 
                            per_last=percent;
                            
                        }
​
                System.out.println("======== "+this.name+"下载了文件:"+filename+" ========");
                    }
            }
            catch(IOException e)
            {
                System.out.println("========文件下载时异常========"+e);
                
            }
            return;
            
            
        }
        
        
        private void filestream()
        {
            
            
            try 
            {
                String target = receive();
                String filename = receive();
                long fileLength = dis.readLong();
​
                    for (Channel other : all) {
                        if (other.name.equals(target)) 
                        {   
                            other.send("filestream"); 
                            other.send(this.name);
                            other.send(filename);
                            other.dos.writeLong(fileLength);
                            other.dos.flush();
                            
​
                            byte[] bytes = new byte[1024];
                            int length = 0;
                            long progress = 0;
                            int percent=0;
                            int per_last=-1;
                            System.out.println("======== 开始转发" +this.name+"向"+target+"发送的文件:"+filename+" ========"); 
                            while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                                other.dos.write(bytes, 0, length);
                                other.dos.flush();
                                
                                progress += length;
                                percent=(int)(100*progress/fileLength);
                                if(percent!=per_last)
                                System.out.print("| " + percent + "% |");
                                if(percent%10==0 && percent!=0 && percent!=per_last)
                                    System.out.print("\n"); 
                                per_last=percent;
                                
                                if(percent>=100)
                                 break;
                            }
                                System.out.println("======== " +this.name+"向"+target+"发送了文件:"+filename+" ========");       
                        }
                    }
            }
            catch(IOException e)
            {
                System.out.println("======== 文件转发时异常 ========"+e);                
            }
            return;
        }
        
        
        
        
        @Override
        public void run() {
            while (isRunning==true && loginflag==1) {  
                String msg = receive();
                if (msg.equals("exit"))
                {
                    this.send(msg);
                    release();
                }
                else if (msg.equals("fileupload"))
                {
                    fileupload();
                }
                else if (msg.equals("filedownload"))
                {
                    filedownload();
                }
                else if (msg.equals("filestream"))
                {
                    filestream();
                }
                else if (!msg.equals("") ) 
                {
                    sendOthers(msg, false);
                }
            }
​
        }
        private void release() {
            isRunning = false;
            if(this.name!=null)
            System.out.println(this.name+"断开了连接");
            Utils.close(dos,dis,client);
            all.remove(this);
            if(this.name!=null)
            sendOthers("======== "+this.name + "离开聊天室 ========", true);
        }
    }
}
​

RoomUser.java

package Client;
​
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class RoomUser {
    
    public static void main(String[] args) throws IOException {
        System.out.println("======== 客户端开始工作 ========");
        BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
        Socket client = new Socket("47.112.128.10", 8888);
        //Socket client = new Socket("127.0.0.1", 8888);
         DataInputStream dis=new DataInputStream(client.getInputStream());
         DataOutputStream dos=new DataOutputStream(client.getOutputStream());
        String name="";
        while(true) {
            
            System.out.println("输入账号: ");
            String readline1 = sin.readLine();
            name = readline1;
            dos.writeUTF(readline1);
            dos.flush();
            System.out.println(dis.readUTF());
            
            System.out.println("输入密码:");
            String readline2 = sin.readLine();
            dos.writeUTF(readline2);
            dos.flush();
            System.out.println(dis.readUTF());
            
            if(dis.readUTF().equals("trueMember"))  {
                System.out.println("\n欢迎来到聊天室!\n");
                System.out.println("如果你要上传文件,请输入fileupload   如果你要下载文件,请输入filedownload");
                System.out.println("私发文件,输入filestream\n");
                
                break;
            }
            else System.out.println("\n你的账号或者密码出错了\n");
        }
        
​
            new Thread(new Send(client, name)).start();
            new Thread(new Receive(client)).start();
        
    }
    
    
    
}
​
​

Send.java

package Client;
​
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
​
public class Send implements Runnable {
    private BufferedReader console;
    private DataOutputStream dos;
    private Socket client;
    private boolean isRunning;
    private String name;
​
    public Send(Socket client, String name) {
        this.client = client;
        console = new BufferedReader(new InputStreamReader(System.in));
        this.isRunning = true;
        this.name = name;
        try {
            dos = new DataOutputStream(client.getOutputStream());
        } catch (IOException e) {
            System.out.println("Send类构造时异常");
            release();
        }
    }
    private String getStrFromConsole() {
        try {
            return console.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
    private void send(String msg) {
        try {
​
             dos.writeUTF(msg);
             dos.flush();
        } catch (IOException e) {
            System.out.println("---客户发送端发送消息异常---");
            release();
        }
    }
    
    
    private void filestream() 
    {
​
        try {
             
        String msg="";
        FileInputStream fis = null;
        
        
        send("filestream");
        System.out.println("请输入  @目标用户名:文件路径  ");
        
        msg = getStrFromConsole();
        int index = msg.indexOf(":");
        String targetName = msg.substring(1, index);
        String root = msg.substring(index+1);
        File file = new File(root);
        String filename = file.getName();
        if(file.exists())
        {
            send(targetName);
            send(filename);
            long Length=file.length();
            dos.writeLong(Length);
            dos.flush();
            
            fis = new FileInputStream(root);
           
            System.out.println("======== 正在向"+targetName+"发送文件:"+filename+" ========");
            byte[] bytes = new byte[1024];
            int length = 0;
            long progress = 0;
            int percent=0;
            int per_last=-1;
            while((length = fis.read(bytes, 0, bytes.length)) != -1) {
                dos.write(bytes, 0, length);
                dos.flush();
                
                progress += length;
                percent=(int)(100*progress/Length);
                if(percent!=per_last)
                    System.out.print("| " + percent + "% |");
                if(percent%10==0 && percent!=0 && percent!=per_last)
                    System.out.print("\n"); 
                per_last=percent;
                
            }
            
            
            //send("");
            System.out.println("======== 文件发送成功 ========");
                
        }
        
            
        }
        catch(IOException e)
        {
            System.out.println("======== 文件发送时异常 ========"+e);
        }
        return;
        
        
    }
    
    private void filedownload() 
    {
        String msg="";
        send("filedownload");
        System.out.println("请输入想要下载的服务器上的文件名  ");
        msg = getStrFromConsole();
        String filename = msg;
        send(filename);
        return;
            
    }
    
    
    private void fileupload() 
    {
        
​
        try {
             
        String msg="";
        FileInputStream fis = null;
        send("fileupload");
        System.out.println("请输入文件路径");
        String root = getStrFromConsole();
        File file = new File(root);
        String filename=file.getName();
        if(file.exists())
        {
            send(filename);
            long Length=file.length();
            dos.writeLong(Length);
            dos.flush();
            
            fis = new FileInputStream(root);
           
            System.out.println("======== 正在上传文件:"+filename+" ========");
            byte[] bytes = new byte[1024];
            int length = 0;
            long progress = 0;
            int percent=0;
            int per_last=-1;
            while((length = fis.read(bytes, 0, bytes.length)) != -1) {
                dos.write(bytes, 0, length);
                dos.flush();
                
                progress += length;
                percent=(int)(100*progress/Length);
                if(percent!=per_last)
                    System.out.print("| " + percent + "% |");
                if(percent%10==0 && percent!=0 && percent!=per_last)
                    System.out.print("\n"); 
                per_last=percent;
                
            }
            
            
            System.out.println("======== 文件上传成功 ========");
                
        }
        
            
        }
        catch(IOException e)
        {
            System.out.println("======== 文件上传时异常 ========"+e);
        }
        return;
        
        
    }
    
    
    @Override
    public void run() {
        while (isRunning) {
            String msg = getStrFromConsole();
            if(msg.equals("exit"))
            {
                send(msg);
                release();
            }
            else if (msg.equals("fileupload"))
            {               
                fileupload();   
            }
            else if (msg.equals("filedownload"))
            {               
                filedownload();   
            }
            else if (msg.equals("filestream"))
            {               
                filestream();   
            }
            else if (!msg.equals("")) {
                send(msg);
            }
        }
    }
    private void release() {
        this.isRunning = false;
        Utils.close(dos,client);
    }
}
​

Receive.java

package Client;
​
​
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class Receive implements Runnable {
    private DataInputStream dis;
    private Socket client;
    private boolean isRunning;
​
    public Receive(Socket client) {
        this.client = client;
        try {
            dis = new DataInputStream(client.getInputStream());
            isRunning = true;
        } catch (IOException e) {
            System.out.println("---客户接收端构造时异常---");
            release();
        }
    }
    
    private String receive() {
        String msg = "";
        try {
             msg = dis.readUTF();
        } catch (IOException e) {
            System.out.println("---客户接收端接收消息异常---"+e);
            release();
        }
        return msg;
    }
    
    private void release() {
        isRunning = false;
        Utils.close(dis, client);
    }
    
    private void filedownload() {
​
​
        String filename=receive();
        System.out.println("======== 正在下载文件:"+filename+" ========");
        
        try
        {
            long fileLength = dis.readLong();
            File directory = new File("download_file");
            if(!directory.exists()) {
                directory.mkdir();
            }
             File file = new File(directory.getAbsolutePath() + File.separatorChar + filename);
             FileOutputStream fos = new FileOutputStream(file);
             
             
             byte[] bytes = new byte[1024];
             int length = 0;
             long progress = 0;
             int percent=0;
             int per_last=-1;
             while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                 fos.write(bytes, 0, length);
                 fos.flush();
                 
                 progress += length;
                 percent=(int)(100*progress/fileLength);
                 if(percent!=per_last)
                 System.out.print("| " + percent + "% |");
                 if(percent%10==0 && percent!=0 && percent!=per_last)
                    System.out.print("\n"); 
                 per_last=percent;
                 
                 if(percent>=100)
                     break;
             }
​
             System.out.println("======== 文件下载成功 ========");
        }
        catch(IOException e)
        {
            System.out.println("======== 文件下载时异常 ========"+e);
        }
        
        return;
    }
    
    
    
    private void filestream() {
​
        
        
        try
        {
            String source =receive();
            String filename=receive();
            System.out.println("======== 正在接收来自"+source+"的文件:"+filename+" ========");
            long fileLength = dis.readLong();
            File directory = new File("download_file");
            if(!directory.exists()) {
                directory.mkdir();
            }
             File file = new File(directory.getAbsolutePath() + File.separatorChar + filename);
             FileOutputStream fos = new FileOutputStream(file);
             
             
             byte[] bytes = new byte[1024];
             int length = 0;
             long progress = 0;
             int percent=0;
             int per_last=-1;
             while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                 fos.write(bytes, 0, length);
                 fos.flush();
                 
                 progress += length;
                 percent=(int)(100*progress/fileLength);
                 if(percent!=per_last)
                 System.out.print("| " + percent + "% |");
                 if(percent%10==0 && percent!=0 && percent!=per_last)
                    System.out.print("\n"); 
                 per_last=percent;
                 
                 if(percent>=100)
                     break;
             }
​
             System.out.println("======== 文件接收成功 ========");
        }
        catch(IOException e)
        {
             System.out.println("======== 文件接收时异常 ========"+e);
        }
        
        return;
    }
    
    
    @Override
    public void run() {
        while (isRunning) {
            String msg = receive();
            if(msg.equals("exit"))
            {
                release();
            }
            else if(msg.equals("filedownload"))
            {               
                filedownload();
            }
            else if(msg.equals("filestream"))
            {               
                filestream();
            }
            else if (!msg.equals("")) 
            {
                System.out.println(msg);
            }
        }
    }
}
​

Utils.java

package Server;
​
import java.io.Closeable;
​
​
public class Utils {
    public static void close(Closeable... targets) {
        for (Closeable target: targets) {
            try {
                if (null != target) {
                    target.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值