用socket编写了一个聊天程序,请问怎么才能实现文件的发送?
用输入输出流只能输出一行一行的语句啊,字符串string……
怎么才能实现一个文件的打包传送。
谢谢各位。

解决方案 »

  1.   

    我刚写完一个这样的程序。
    UINT _SendFileThread(LPVOID lparam)
    {
       CFile MyFile;//open file.
    if(!MyFile.Open(pDlg->m_FileName, CFile::modeRead | CFile::typeBinary))
    {
    return -1;
    }
    MyFile.Seek(0,CFile::begin); //send file from head     for(;;)
          {
           MyFile.Read();//read file
           send();  //send file 
          }
    }
    接受端就自己设置了,用线程,或者消息都可以的
      

  2.   

    呵呵,我问的是用java怎么去实现,而不是c++
    而且我的问题有点前提的,就是已经实现了聊天的功能,readline(),现在在这个基础上可以实现文件发送吗?
    用readline()
    呵呵
    谢谢
      

  3.   

    我写的程序,你看看,不过我这个是客户端发送文件给服务器端后要打印这个文件的,你把程序再改改就可以了,希望有用!还用一点,我这个没有用线程做,你再改改!
    package com.szallcom.tools;
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import javax.swing.*;
    import javax.swing.JFileChooser;public class Client 
    {

    public static void main(String[] args) throws UnknownHostException, IOException
    {
    JFileChooser fileChooser = new JFileChooser();

        int state = fileChooser.showOpenDialog(fileChooser); //弹出文件选择对话框
        
    int i = JFileChooser.APPROVE_OPTION;
    if (state == i) //如果用户选定了文件
    {
    File file = fileChooser.getSelectedFile(); //获取选择的文件

    String s=file.getName();//得到用户选定的文件名.....

    FileInputStream fos=new FileInputStream(file);
        
        Socket server=new Socket(InetAddress.getLocalHost(),3108);//连接服务器
        
        OutputStream netOut=server.getOutputStream();//得到输入流
        
        DataOutputStream input=new DataOutputStream(server.getOutputStream());
        
        OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));
        
        fenshu Fenshu=new fenshu();
        
        String j=Fenshu.fenshu();//打印份数.....
        
        input.writeUTF(s);//把文件名写入通道......
        
        input.writeUTF(j);//把打印份数写入通道......
        
        byte[] buf=new byte[2048];
        
        int num=fos.read(buf);    while(num!=(-1)){//是否读完文件       // System.out.println("文件传输中");
               doc.write(buf,0,num);//把文件数据写出网络缓冲区           doc.flush();//刷新缓冲区把数据写往客户端           num=fos.read(buf);//继续从文件中读取数据    }
      //  System.out.println("文件传输完毕");
        fos.close();//关闭文件
        doc.close();//关闭流
        
     }
     }}//写了一个发送打印份数的类.....
    class fenshu
    {
    public String fenshu()
    {
    String i=null;
    boolean boo=true;
    while(boo)
    {
     i=String.valueOf(JOptionPane.showInputDialog(null,"请输入打印份数","print",JOptionPane.WARNING_MESSAGE));
    char check[]=i.toCharArray();
    for(int z=0;z<check.length;z++)
    {
    if(!(Character.isDigit(check[z])))
    {
    JOptionPane.showMessageDialog(null,"你输入了非法字符","警告",JOptionPane.WARNING_MESSAGE);
    }
    else
    {
    boo=false;
    }
    }
      }return i;
    }
    }
    下面是服务器端
    package com.szallcom.tools;import java.io.BufferedInputStream;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.RandomAccessFile;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.sql.SQLException;
    import javax.swing.JOptionPane;
    public class Server
    {

    public static void main(String[] args) throws IOException, InterruptedException, SQLException
    {

     information jump=new information();
     jump.Info();
     ServerSocket ss=new ServerSocket(3108);
     while(true)
     {
         Socket server=ss.accept();//接受客户机的访问.并建立连接.
         
         InetAddress s1=server.getInetAddress();//得到对方ip地址:
         
         String address="e:\\"+s1;
         
         String tempip=""+s1;//把ip地址转换为字符串的形式!!!!
         
         CheckFolderAndCreateFolder folder=new CheckFolderAndCreateFolder();
         
         folder.createFolder(address);
         
         DataInputStream input=new DataInputStream(server.getInputStream());
         
         String filename=input.readUTF();//得到文件名....
         
         String j1=input.readUTF();//得到用户打印份数.....
         
         SaveintoDatabase a=new SaveintoDatabase();
         
     a.insert(tempip,filename,j1);

        // System.out.print(filename);
         
         String s=address+"\\"+filename;//得到文件名:
         
         CheckFileExisted check=new CheckFileExisted();
         String flag=check.createFolder(address,filename);
        if(flag.equals("no"))
        {
          
         File file=new File(s);
       
         file.createNewFile();//追寻一个名为haha.text的文件!
         
         RandomAccessFile raf=new RandomAccessFile(file,"rw");
       
         
         InputStream netIn=server.getInputStream();//得到通道中的输入流
         
         InputStream in=new DataInputStream(new BufferedInputStream(netIn));
         
         byte[] buf=new byte[2048];
         
         int num=in.read(buf);                   while(num!=(-1)){//是否读完所有数据            raf.write(buf,0,num);//将数据写往文件            raf.skipBytes(num);//顺序写文件字节            num=in.read(buf);//继续从网络中读取文件     }     in.close();     raf.close();
        }
        String test=s+"ka";
        String dayingfenshu=j1;
        String jpg[]=test.split("jpg");
        String doc[]=test.split("doc");
        String txt[]=test.split("txt");
        String jif[]=test.split("gif");
        Printtupian photo=new Printtupian();
        Printtxt printTxt=new Printtxt();
        if(jpg.length==2)
        {
         photo.printjpg(s,dayingfenshu);
        }
        if(doc.length==2)
        {
         WordToTxt translant=new WordToTxt();
         String add=address+"\\";
         String paths = new String(add);
         String savepaths = new String (add);
         translant.change(paths,savepaths);
         String ll=doc[0]+"txt";
            printTxt.Print(ll,dayingfenshu);
        }
        if(txt.length==2)
        {
        
         printTxt.Print(s,dayingfenshu);
             
        
        }
        if(jif.length==2)
        {
        
         photo.printjpg(s,dayingfenshu);
        }
       // file.delete();
        
    }
    }
    }
    class information
    {
    public void Info()
    {
    JOptionPane.showMessageDialog(null,"打印服务器已运行,正在等待客户的连接","成功信息",JOptionPane.WARNING_MESSAGE);
    }
    }
      

  4.   

    呵呵,谢谢你的帮助,不过好象不太行.THANK YOU ALL THE SAME.
      

  5.   

    你用的是BufferedReader吧
    这个主要用来读STRING比较好一点
    应该用上一层的 
    InputStream或者InputStreamReader发送方以OutputStream发送部分就不写了,和写STRING基本上差不多接收部分
    FileOutputStream writer = new FileOutputStream("c:\\test.file");  //文件写入器InputStream is = socket.getInputStream();
    byte[] buffer = new byte[1024];  //每段1024,也可以设置大一点
    int read;
    while((read=is.read(buffer))!=-1){
      writer.write(buffer,0,read);  //写入文件
      writer.flush();
    }
    writer.close();
    is.close();