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

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

client


pa


ckage 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) {
         }
     }
 }