java socket 上传文件与对话自由选择(不过只能监听一个客户端,因为没有用while循环)

来源:互联网 发布:大麦电话软件下载 编辑:程序博客网 时间:2024/06/06 22:28

因为没有用while循环,所以只能监听一个客户端,此程序主要是把两者整合起来,使得用户可以选择。

先传上来,以后用的时候直接下载copy,到时候改改while的位置就能实现监听多个客户端。

client


package client;  
import java.io.BufferedReader;  
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.OutputStream;  
import java.net.InetAddress;  
import java.net.InetSocketAddress;
import java.net.Socket;  
import java.util.Scanner;
public class Client {  
private static String ServerIpAddress = "127.0.0.1";// 对方的IP 
static Scanner sc=new Scanner(System.in);
    public static void main(String[] args) throws IOException {  
        
        String words = "Hello";// 对方的话  
        String temp = null;  
        


        
        while(true){
        System.out.println("*******选择操作:**********");
        System.out.println("*******1对话:************");
        System.out.println("*******2传输文件***********");
        System.out.println("*******3退出系统***********");
        System.out.println("************************");
       
        
        
        Socket s = null;  
      OutputStream outputstream = null;  
        InputStream inputstream = null;  
        byte[] serverSay = new byte[1000];// 读取<1KB  
        int len;
        int t=sc.nextInt();
        if(t==1){
        //如果t等于1,那么就会是说客户端与服务器之间进行对话交流。就通过给服务器一个word标记,让服务器识别,然后进行对话的操作。
          String flag="word";  
          //socket连接服务器,地址是默认的本地,端口号自定义,与服务器一致就好。
         s = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号  
          //获取输出流,也就是输出到服务器的内容
         outputstream = s.getOutputStream();  
           
          outputstream.write(flag.getBytes("gbk"));// 向服务器发送消息
          System.out.println("已向服务器发送对话请求。现在接收服务器消息");
          //获取输入流,获得服务器传过来的数据
          inputstream = s.getInputStream();
          len = inputstream.read(serverSay);// 接受服务器消息 
          if(new String(serverSay, 0, len).equals("beginword"))
        sendword();//当sendword输入quit时,就会返回到这,然后因为while而实现死循环
          
         t=3;
        }
        else if(t==2){
        String flag="file";  
          //socket连接服务器,地址是默认的本地,端口号自定义,与服务器一致就好。
         s = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号  
          //获取输出流,也就是输出到服务器的内容
         outputstream = s.getOutputStream();  
           
          outputstream.write(flag.getBytes("gbk"));// 向服务器发送消息
          System.out.println("已向服务器发送文件请求。现在接收服务器消息");
          //获取输入流,获得服务器传过来的数据
          inputstream = s.getInputStream();
          len = inputstream.read(serverSay);// 接受服务器消息 
          if(new String(serverSay, 0, len).equals("beginfile")){
        //当sendword输入quit时,就会返回到这,然后因为while而实现死循环
         sendfile();
         
          }
          
         t=3;
        }
        
        if(t==3){
        outputstream.close();
        inputstream.close();
        s.close();
        break;
        }
        }
        
        System.out.println("退出系统成功 !");
        
    }
   //传输文件 
    private static void sendfile() {
System.out.println("开始传输文件");

int length = 0;
        byte[] sendBytes = null;
        Socket socket = null;
        DataOutputStream dos = null;
        FileInputStream fis = null;
        OutputStream outputstream = null;
        while(true){
        try {
            try {
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入地址:(equit表示退出)");
            String s=sc.next();
            if(s.equals("quit")){
           
            break;
            }
           
           
                socket = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号 
                outputstream = socket.getOutputStream();  
                outputstream.write(s.getBytes("gbk"));// 向服务器发送消息 
                
                dos = new DataOutputStream(socket.getOutputStream());
                File file = new File(s);
                fis = new FileInputStream(file);
                sendBytes = new byte[1024]; 
                while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {
                    dos.write(sendBytes, 0, length);
                    dos.flush();
                }
            } finally {
                if (dos != null)
                    dos.close();
                if (fis != null)
                    fis.close();
                if (socket != null)
                    socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
   }

   //传输字符,与客户端进行交流
public static void sendword() throws IOException{
     byte[] serverSay = new byte[1000];// 读取<1KB  
     Socket s = null;  
    InputStreamReader read = null;  
     OutputStream outputstream = null;  
          InputStream inputstream = null;  
    String temp = null; 
    int len;
      String words = "Hello";// 对方的话 
     // 取得你各他的Message  
        System.out.println("请输入想对他(她)说的话----输入QUIT 退出!!:");
        //输入
        read = new InputStreamReader(System.in);  
        while (true) {  
            try {  
                temp = "Hello";  
                temp = new BufferedReader(read).readLine();  
                words = temp;
                int flag=1;
              
                temp = "客户端....." + words;  
                if (words.equals("quit"))  {
                flag=0;
                temp=words;
                }
                
                // 发起通信  
                s = new Socket(InetAddress.getByName(ServerIpAddress), 9527);// 套接字的IP地址和端口号  
                //是输出与输入获取到socket的值,也就是与服务器之间的交流
                outputstream = s.getOutputStream();  
                inputstream = s.getInputStream();  
                outputstream.write(temp.getBytes("gbk"));// 向服务器发送消息 
                if(flag==0){
                break;
                }
                
                len = inputstream.read(serverSay);// 接受服务器消息  
                System.out.println( new String(serverSay, 0, len));// 客户端控制台显示服务器返回的信息  
            } catch (Exception e) {  
            } finally {  
                inputstream.close();  
                outputstream.close();  
                s.close();// 记住一定要关闭这些输入,输出流和套接字  
            }  
        }// end while  
    }
    
    
}  





服务器端

分三个类,一个server,是总的类,在其中根据用户不同的操作,调用了不同的类,如果用户选择了对话,就调用socketwordListener类,如果选择了文件上传,就调用ServerFileListener类


上代码:


server.java

/*
 * 服务器总类,负责监听客户端先发来的消息,可以是对话或者发送文件,然后进入不同的类进行操作。socket的accept监听是在调用的类里实现的。
 * */






package server;  
  
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.OutputStream;  
import java.net.ServerSocket;  
import java.net.Socket;  


  
public class Server {  
static Socket socket = null;  
static ServerSocket serversocket;
    public static void main(String args[]) throws IOException {   
     OutputStream outputstream = null;  
          InputStream inputstream = null;  
          byte[] rece = new byte[1000];  
          String reces=null;
          serversocket = new ServerSocket(9527); // 服务器的套接字,端口为9527 
     socket = serversocket.accept(); //监听客户端 
     inputstream = socket.getInputStream();
outputstream = socket.getOutputStream();// 得到输出流
  int len;
        len = inputstream.read(rece);// 接受客户端消息  
        if (len != 0)  
            reces = new String(rece, 0, len);  
        //如果客户端给的是word,就代表是对话请求,
        if(reces.equals("word")){
        //返回可以开始对话
        String s="beginword";
        System.out.println("输出给客户端一个beginword");
        outputstream.write(s.getBytes());// 返回给客户端的欢迎信息
        socketwordListener swl=new socketwordListener(serversocket);
        swl.sta();
        }else if(reces.equals("file")){
        //文件操作
        String s="beginfile";
        System.out.println("输出给客户端一个beginfile");
        outputstream.write(s.getBytes());
        //直接调用监控类,在监控类里进行传输操作。。。。防止出现乱码
        ServerFileListener stp=new ServerFileListener(serversocket);
        stp.sta();
        }
        else{
        //结束操作
        String s="end";
        System.out.println("输出给客户端一个end");
        outputstream.write(s.getBytes());
        }
        outputstream.close();
        inputstream.close();
        socket.close();
     
       
    }
}  

socketwordListener类


/*
 * 对话操作
 * */






package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;




public class socketwordListener extends Thread{


ServerSocket server ;
static int flag=1;
public socketwordListener(ServerSocket socket){
this.server=socket;
}


//调用这个函数进行监控,新建一个线程去操作相应的事情
public void sta() throws IOException {
 
       try {
           Thread th = new Thread(new Runnable() {
               public void run() {
                   while (true) {
                       try {
                       Socket socket;
                       //监听客户端发来的消息,在新线程里操作,
                       if(flag==1){
                       socket = server.accept();
                       //监听有客户端连接,进入对话操作。
                       wordtodo(socket);
                       }
                       } catch (Exception e) {
                       }
                   }
               }
           });


           th.run(); //启动线程运行
       } catch (Exception e) {
           e.printStackTrace();
       }
   }




    public void run(){
   
    }
    //对话操作
    public static void  wordtodo(Socket socket){
     OutputStream outputstream = null;  
          InputStream inputstream = null;  
          byte[] rece = new byte[1000];  
          String reces=null;
    try {
inputstream = socket.getInputStream();
outputstream = socket.getOutputStream();// 得到输出流
  int len;
        len = inputstream.read(rece);// 接受客户端消息  
        if (len != 0)  
            reces = new String(rece, 0, len);  
        if(reces.equals("quit")){
        System.out.println("客户端退出!");
        flag=0;
        }
        System.out.println(reces);  
        //输入要发送给客户端的值
        BufferedReader bufferreader = new BufferedReader(new InputStreamReader(System.in));  
        outputstream.write(("服务器....."+bufferreader.readLine()).getBytes());// 返回给客户端的欢迎信息
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 得到输入流 
    finally{
    if(socket!=null)
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
socket=null;
e.printStackTrace();
}
    }
    }


}


socketFileListener类



/*
 * 文件操作类
 * */
package server;
import java.net.*;
import java.io.*;


public class ServerFileListener implements Runnable {
  ServerSocket server ;
  public ServerFileListener( ServerSocket server){
  this.server=server;
  }
   
  //文件操作的socket监听
    public void sta() throws IOException {
  
        try {
            Thread th = new Thread(new Runnable() {
                public void run() {
                    while (true) {
                        try {
                            System.out.println("开始监听...");
                            Socket socket = server.accept();
                            //有客户端连接,进入相应操作
                            receiveFile(socket);
                        } catch (Exception e) {
                        }
                    }
                }
            });


            th.run(); //启动线程运行
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void run() {
    }


    //文件操作
    public static void receiveFile(Socket socket) {
        byte[] inputByte = null;
        byte[] serverSay = new byte[1000];// 读取<1KB  
        int length = 0;
        DataInputStream dis = null;
        FileOutputStream fos = null;
        InputStream inputstream = null; 
        try {
            try {
            inputstream = socket.getInputStream();  
            int len = inputstream.read(serverSay);// 接受服务器消息  
                 System.out.println( new String(serverSay, 0, len));// 客户端控制台显示服务器返回的信息
                 String filename=new String(serverSay,0,len);
                 String[] sa=filename.split("\\/");
                 //输出文件的名字
                 System.out.println("__________________________"+sa[sa.length-1]);
                 //构造要存储的路径,该路径是项目文件夹下,其中。/代表该项目下。然后获取的加了一个文件名
                 String newname="./"+sa[sa.length-1];
           
           
                dis = new DataInputStream(socket.getInputStream());
               System.out.println("+++++++++++++++++");
                fos = new FileOutputStream(new File(newname));
                inputByte = new byte[1024];
                System.out.println("开始接收数据...");
                while ((length = dis.read(inputByte, 0, inputByte.length)) > 0) {
                    System.out.println(length);
                    fos.write(inputByte, 0, length);
                    fos.flush();
                }
                System.out.println("完成接收");
            } finally {
                if (fos != null)
                    fos.close();
                if (dis != null)
                    dis.close();
                if (socket != null)
                    socket.close();
            }
        } catch (Exception e) {
        }
    }
}

0 0
原创粉丝点击