java socket-我是个新手,请问如何让cilent接收完毕文件后,server停止服务,谢谢

问题描述

我是个新手,请问如何让cilent接收完毕文件后,server停止服务,谢谢

server程序:

 package com.alex;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import com.alex.dao.BaseDAO;
import com.alex.util.FileIO;
import com.alex.util.MD5Util;

public class Server {

    private int port;
    private String serverpath;

    public Server() {
        BaseDAO base=new BaseDAO();
        port = Integer.parseInt(base.getValue("port"));
        serverpath = base.getValue("serverpath");
    }

    public static void main(String[] args) {
        Server server=new Server();
        server.start();
    }

    public void start(){
        //1建立连接

        ServerSocket serverSocket=null;
        try{
            serverSocket=new ServerSocket(port);
            Socket socket=null;
            while(true){
                socket=serverSocket.accept();
                OutputStream os=socket.getOutputStream();
                BufferedOutputStream bos=new BufferedOutputStream(os);

                InputStream is=socket.getInputStream();
                BufferedInputStream bis=new BufferedInputStream(is);

                //2返送MD5值
                System.out.println("-------------------");
                System.out.println("server发送md5值开始");
                String md5=MD5Util.getHash(serverpath);
                System.out.println("MD5:"+md5);
                System.out.println("server发送md5值结束");
                System.out.println("-------------------");

                byte[] buf=md5.getBytes();
                bos.write(buf);
                bos.flush();

                //发送文件
                if(bis.read()==0){
                    System.out.println("server开始发送文件");
                    FileIO.sendFile(serverpath,bos);

                }else{
                    break;
                }

                socket.close();
            }

            System.out.println("文件验证结束");

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

client程序


package com.alex;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.NoSuchAlgorithmException;

import com.alex.dao.BaseDAO;
import com.alex.util.FileIO;
import com.alex.util.MD5Util;

public class Client {

    private String ip;
    private int port;
    private String clientpath;

    public Client() {
        BaseDAO base=new BaseDAO();
        ip = base.getValue("ip");
        port =Integer.parseInt(base.getValue("port"));
        clientpath = base.getValue("clientpath");
    }

    public static void main(String[] args){
        Client client=new Client();
        client.start();
    }

    public void start(){

        Socket socket=null;
        try {
            System.out.println("IP地址:"+ip+"Port号:"+port);
            //1.创建连接
            socket=new Socket(ip,port);
            InputStream is=socket.getInputStream();
            BufferedInputStream bis=new BufferedInputStream(is);

            OutputStream os=socket.getOutputStream();
            BufferedOutputStream bos=new BufferedOutputStream(os);

            //2.获得MD5值
            byte[] buf=new byte[32];
            bis.read(buf);
            String serverMd5=new String(buf);
            System.out.println(serverMd5);
            System.out.println("开始计算client文件MD5");
            try {
                String clientMd5=MD5Util.getHash(clientpath);
                System.out.println("ClientMd5:"+clientMd5);
                //3.比较MD5
                if(serverMd5.equals(clientMd5)){
                    System.out.println("文件已存在,谢谢");
                }else{
                    //4.返回0,等待服务器发送文件过来。
                    bos.write(0);
                    bos.flush();

                    FileIO.saveFile(clientpath, bis);
                }
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

解决方案

client 回复接收完毕,server收到并close

解决方案二:

你服务端不要 while(true)了呗 接受一次请求就结束了吗

时间: 2024-10-31 05:39:08

java socket-我是个新手,请问如何让cilent接收完毕文件后,server停止服务,谢谢的相关文章

请问:exe4j转成.exe文件后,打开.exe时没有反应,怎么回事?谢谢!

问题描述 请问:exe4j转成.exe文件后,打开.exe时没有反应,怎么回事?谢谢! 请问:exe4j转成.exe文件后,打开.exe时没有反应,怎么回事? 解决方案 exe4j将jar文件转成exe用exe4j工具将eclipse生成的jar文件制作成exe文件 解决方案二: 估计你原来的java程序,代码有问题,导致exe启动不了 解决方案三: http://zhidao.baidu.com/link?url=-UFzH73Z_jyWI9NipeIbF4ueSvHePu8gsoI36rA2

我是VB新手,请问对同时对两个表或多个表数据修改咋办!

问题描述 谢谢了! 解决方案 解决方案二:不能同時改.如果你的數據修改動作具有原子性(也就是不可分割的),可以使用事務.上面所說的不能同時改,有兩個特例:a.如果要修改的不同表的字段之間具有級聯更新的主外鍵關係,那么當你修改主鍵時,外鍵會自動更新.b.觸發器,與主鍵鍵類似解决方案三:下面是msdn的一個使用事務的範列PrivateSubExecuteSqlTransaction(ByValconnectionStringAsString)UsingconnectionAsNewSqlConnec

代码提示出错-请问我这段代码哪里出错了,为什么总是异常,我是个新手

问题描述 请问我这段代码哪里出错了,为什么总是异常,我是个新手 package control; import javax.swing.JFrame public class DebugTest { public static void main(String[] args) { int[] ints= new int[20]; try { for (int i=0; i < 20; i ++) { ints[i] = i+1; Ststem.out.println(i+1); } } catc

一道java题目,请大虾们帮帮忙,我是个新手,谢谢

问题描述 一道java题目,请大虾们帮帮忙,我是个新手,谢谢 编写一个程序,对于输入的一段程序,可以获取该程序的单词符号.单词符号的类别有基本字.标识符.常数.算符和界符.关键字为基本字,由字母组成,如int.for和while:变量名和函数名为标识符,由字母和数字构成,如fun1和age:固定不变的数值为常数,如12.13.86和25e8(科学计数法):算符如+.-.*./ .%.&&:界符如 {.[.(. :和:等. 如, public?static?void?main (String

我是新人,请问论坛内是否有JAVA相关的视频教程以及书籍可以下载?

问题描述 我是新人,请问论坛内是否有JAVA相关的视频教程以及书籍可以下载?给两个下载链接? 解决方案 解决方案二:百度一下有很多的尚学堂解决方案三:传智播客的还不错

线程-使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求

问题描述 使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求 初学java,目前写了一个服务端和一个客户端.大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信.也仅仅是是接受和返回简单的字符串.部分代码如下 public void run(){ try{ serverSocket=new ServerSocket(SERVER_PORT_ONE); System.out.println("serversocket已创建"

java socket 文件传输-java socket 传文件文件接收后不能打开

问题描述 java socket 传文件文件接收后不能打开 java socket传文件,客户端将文件读取到byte[]中,然后用Map对相关内容进行包装之后输出到服务器端,但服务器端读取文件内容的循环除第一次读取的Map是客户端写入过来的内容外,从第二次循环开始Map的内容都跟第一次一样的,请问怎么回事? 服务器端代码: `public void run() { ObjectInputStream is = null; OutputStream os = null; byte cache[]

xml-通过java socket传输XML

问题描述 通过java socket传输XML 请问,在不同电脑间传输XML,如果A电脑接收了B电脑发送的XML,用dom4j解析XML得到有用数据后再如何动态生成XML,然后发送给C电脑? 好比B电脑要发送的XML只有几个空需要从A电脑的XML中读取数据填入,再发送给C电脑,这里数据自动补充填入采取什么方法? 刚学习这块没多久,希望好心人能够帮忙指点一下,理清思路,谢谢 解决方案 首先,xml数据格式是通信双方约定好的,虽然数据是xml格式,但是本质从Socket流中读取后得到的是字符串,那么

java socket远程登录问题

问题描述 java socket远程登录问题 server =new ServerSocket(10086); while(true) { // socket = server.accept(); //textarea.append("1111"); //new Thread(new ReadHandlerThread(socket)).start(); //new Thread(new WriteHandlerThread(socket)).start(); reader=new B