工作需要,在客户端利用Socket发送文件到服务端,要求:
1将单一文件发送,扩展为循环文件发送.
2.发送失败则重新发送,最多重发3次,若不成功,则记录该文件
3.循环发送时,每一个发送完毕都需要完整性验证。谁能给个完整的事例,先谢过了!

解决方案 »

  1.   

    package cn.com.hgeagle.thread;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;public class Handler implements Runnable { // 负责与单个客户通信的任务
    private Socket socket; public Handler(Socket socket) {
    this.socket = socket;
    } private PrintWriter getWriter(Socket socket) throws IOException {
    OutputStream socketOut=socket.getOutputStream();
            return new PrintWriter(socketOut,true);
    } private BufferedReader getReader(Socket socket) throws IOException {
      InputStream socketIn=socket.getInputStream();
            return new BufferedReader(new InputStreamReader(socketIn));
    } public String echo(String msg) {
     return "echo:"+msg;
    } public void run() {
    try {
    System.out.println("New connection accepted "+ socket.getInetAddress() + ":" + socket.getPort());
    BufferedReader br = getReader(socket);
    PrintWriter pw = getWriter(socket);
    String RemoteIP = socket.getInetAddress().getHostAddress();
    String RemotePort = ":" + socket.getLocalPort();
    System.out.println("A client come in!IP:" + RemoteIP+ RemotePort);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    System.out.println("服务端 请输入...");
    String line = in.readLine();
    line+=line;
    System.out.println("client send is :" + line);
    // setValue(line);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.println("Handler Your Message Received!");
    out.close();
    in.close();
    socket.close();
    // String msg = null;
    // while ((msg = br.readLine()) != null) { // 接收和发送数据,直到通信结束
    // System.out.println(msg);
    // pw.println(echo(msg));
    // if (msg.equals("bye"))
    // break;
    // }
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    if (socket != null)
    socket.close(); // 断开连接
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    }
    }package cn.com.hgeagle.thread;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;public class MultiThreadClient {
        
    public static void main(String[] args) {
    new MultiThreadClient().response();
    }

        public void response() {
         System.out.println("客户端启动...");
            int numTasks = 2;
            ExecutorService exec = Executors.newCachedThreadPool();
            for (int i = 0; i < numTasks; i++) {
                exec.execute(createTask(i));
            }    }    // 定义一个简单的任务
        private static Runnable createTask(final int taskID) { // ,String sIp,final int iPort
            return new Runnable() {
                private Socket socket = null;
                private int port=8821;            public void run() {
                 System.out.println("客户端 请输入...");
                    System.out.println("Task " + taskID + ":start");
                    try {                    
                        socket = new Socket("localhost", port);
                        // 发送关闭命令
                        OutputStream socketOut = socket.getOutputStream();
                        System.out.println("try 客户端 请输入...");
                        socketOut.write("shutdown\r\n".getBytes());                    // 接收服务器的反馈
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(socket.getInputStream()));
                        String msg = null;
                        while ((msg = br.readLine()) != null)
                            System.out.println(msg);
                    } catch (IOException e) {                    
                        e.printStackTrace();
                    }
                }        };
        }
    }
    package cn.com.hgeagle.thread;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.*;
    import java.util.concurrent.*;public class MultiThreadServer {
        private int port=8821;
        private ServerSocket serverSocket;
        private ExecutorService executorService;//线程池
        private final int POOL_SIZE=10;//单个CPU线程池大小
        
        public MultiThreadServer() throws IOException{
            serverSocket=new ServerSocket(port);
            //Runtime的availableProcessor()方法返回当前系统的CPU数目.
            executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
            System.out.println("服务器启动");
        }
        
        public void service(){
            while(true){
                Socket socket=null;
                try {
                    //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
                    socket=serverSocket.accept();
                    executorService.execute(new Handler(socket));
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[] args) throws IOException {
            new MultiThreadServer().service();
        }}
      

  2.   

    呵呵,实在不好意思,客户有改动,在客户端不能使用多线程,传输的是文件 例如:text1.txt 
    text2.txt  text3.txt text4.txt text5.txt楼上的大哥,不好意思啊,让你写了那么代码   
      

  3.   

    请问 2楼的 发帖时候怎么让java code自动加色的?
      

  4.   

    1,编写Data类,该类可序列化,
    字段
    ,发送时间
    ,发送人ID
    ,接收人ID
    ,数据,必须可序列化2,编写用户数据堆栈,可以用数组实现。
    ,实现数据保存
    ,push(Data data)方法加数据
    ,Data pop()方法取数据3,编写服务类.
    ,有当前所有在线用户
    ,数据处理集,Map<Class,Object>propercess;//跟根要处理的数据Class存进去,当客户端发来数据时,只要拿到Data里面的数据class去Map里面找,在去执行接口的方法,这样要加功能的话,只要加一个相应的数据处理类了,不要大多改变代码
    ,有所有用户的消息
    ,非静态块实现所有用户消息的读取
    , close()关闭服务,并把所有用户数据写入硬盘
    ,start()开始服务监听1219端口,接收用户登录,成功后把当前用户的所有数据发给用户,在创建一个用户数据接收线程,接收用户发来的数据进行处理,线程类会详细说明---,失败就关闭连接
    3,编写用户数据处理类
        --一个对象对应一个用户
        --如果当前用户在线,就循环猛读数据并把数据丢给相应的方法进行处理,如果用户下线了,就把用户从服务类里面的当前在线用户中删除。
        ,accptData(Data data)方法用来处理用户发送的数据,先根据数据接收人号码去服务类的当前在线用户中拿到接收用户的通信流如果接收方在线,就直接把数据发给接收方,否则把数据存到服务类所有用户数据里面。
    4,编写数据处理类
            ,propercess(Object obj)根据特定的数据进行处理

    -----------------------服务端功能不多,重点在客服端,如果对功能增加或修改服务端不要改,子要到客服端增加相应的数据处理类就行了------------------------------------------