A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王维波 黑马帝   /  2011-11-17 21:15  /  1978 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
import java.net.*;

class PicClien
{   
          public static void main(String []  args)throws Exception
          {
                  Socket s=new Socket("192.168.1.254",1007);
                  FileInputStream fis=new FileInputStream("c:\\1.bmp");
                  OutputStream  out=s.getOutputStream();
                  byte[] buf=new byte[1024];
                  int len=0;
                  while((len=fis.read(buf))!=-1)
                  {
                          out.write(buf,0,len);
                  }
                  InputStream in=s.getInputStream();
                  byte[] bufIn= new byte[1024];
                  int num=in.read(bufIn);
                  System.out.println(new String(bufIn,0,num));
                  fis.close();
                  s.close();
          }
}


class  PicServer
{
        public static void main(String[] args)throws Exception
        {
                ServerSocket ss= new ServerSocket(1007);
                Socket s=ss.accept();
                InputStream in=s.getInputStream();
                FileOutputStream fos= new FileOutputStream("server.bmp");
                byte[] buf= new byte[1024];
                 
                int len=0;
                while((len=in.read(buf))!=-1)
                {
       fos.write(buf,0,len);               
                }
                OutputStream out= s.getOutputStream();
                out.write("上传成功".getBytes());
                fos.close();
                s.close();
                ss.close();
        }

}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

3 个回复

倒序浏览
啥错误?是发送不过去么?flush一下试试。
回复 使用道具 举报
本帖最后由 任俊杰 于 2011-11-22 13:56 编辑

这个我知道,呵呵。在服务端的这个地方  while((len=in.read(buf))!=-1),这个read方法如果没有读到数据就一直阻塞在那个地方。
而客户端的out.write(buf,0,len);的这个方法,一直没有flush()所以其实一直没有把数据发向服务端所以服务端就一直阻塞着。但是,Socket里面得到的输出流是继承的FileOutputStream,这个类里面flush()没有做任何操作,所以调用flush()方法不起作用。当然也不能调用close()方法,在OutputStream这个体系中,close()方法被协定只关流不做任何其它操作,所以不能用这个方法把数据刷向服务端。况且,这个流中的close()方法,实际是关闭的socket,所以调用后,后面就不能用那个socket了。所以这里可以用socket类中提供的shutdownOutput()方法。
而后面int num=in.read(bufIn);客户这个地方一直读不到数据,因为服务端一直在前面阻塞着,所以服务端后面的代码一直没有执行。
所以客户端这个地方也一直读不到数据,而读不到数据就会一直阻塞着。所以导致最后,服务端和客户端都一直阻塞着。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
import java.io.*;
import java.net.*;

class PicClien {
        public static void main(String[] args) throws Exception {
                Socket s = new Socket("192.168.0.1", 8007);
                FileInputStream fis = new FileInputStream("c:\\1.bmp");
                OutputStream out = s.getOutputStream();
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = fis.read(buf)) != -1) {
                        out.write(buf, 0, len);
                }
                System.out.println("发送成功");       
                fis.close();
                s.close();
        }
}

import java.io.*;
import java.net.*;

class PicServer {
        public static void main(String[] args) throws Exception {
                ServerSocket ss = new ServerSocket(8007);
                Socket s = ss.accept();
                InputStream in = s.getInputStream();
                FileOutputStream fos = new FileOutputStream("server.bmp");
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = in.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                }
                fos.close();
                s.close();
                ss.close();
        }

}

如果只是实现复制文件的功能,上面的代码你给修改下IP应该就可以用,前提是你C盘下有源文件存在的话。
看你了的代码,好像是想模仿毕老师,在客户端上传文件完成后,服务端向客户端发送一个 “上传成功”的字符串,对吗?
视频里面有介绍方法,
s.shutdownOutput(); //结束标记。{:soso_e125:}
视频看完了,、吃碗冷饭准备睡觉

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马