SOCKET怎么发送文件?

kunmengzi 2006-08-17 12:10:16
用socket编写了一个聊天程序,请问怎么才能实现文件的发送?
用输入输出流只能输出一行一行的语句啊,字符串string……
怎么才能实现一个文件的打包传送。
谢谢各位。
...全文
457 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
beiouwolf 2006-11-17
  • 打赏
  • 举报
回复
你用的是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();
kunmengzi 2006-11-17
  • 打赏
  • 举报
回复
THANKS
kunmengzi 2006-11-16
  • 打赏
  • 举报
回复
呵呵,谢谢你的帮助,不过好象不太行.

THANK YOU ALL THE SAME.
凉凉二点凉 2006-11-15
  • 打赏
  • 举报
回复
理解错了,不好意思,不过像你那样做应该很难的吧!
凉凉二点凉 2006-11-15
  • 打赏
  • 举报
回复
我写的程序,你看看,不过我这个是客户端发送文件给服务器端后要打印这个文件的,你把程序再改改就可以了,希望有用!还用一点,我这个没有用线程做,你再改改!
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);
}
}
kunmengzi 2006-11-15
  • 打赏
  • 举报
回复
呵呵,我问的是用java怎么去实现,而不是c++
而且我的问题有点前提的,就是已经实现了聊天的功能,readline(),现在在这个基础上可以实现文件发送吗?
用readline()
呵呵
谢谢
su47flying 2006-08-17
  • 打赏
  • 举报
回复
我刚写完一个这样的程序。
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
}
}


接受端就自己设置了,用线程,或者消息都可以的
zhmt 2006-08-17
  • 打赏
  • 举报
回复
无情接分,友情up!
waterborn 2006-08-17
  • 打赏
  • 举报
回复
C++ @_@

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧