SOCKET怎么发送文件? 用socket编写了一个聊天程序,请问怎么才能实现文件的发送?用输入输出流只能输出一行一行的语句啊,字符串string……怎么才能实现一个文件的打包传送。谢谢各位。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我刚写完一个这样的程序。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 }}接受端就自己设置了,用线程,或者消息都可以的 呵呵,我问的是用java怎么去实现,而不是c++而且我的问题有点前提的,就是已经实现了聊天的功能,readline(),现在在这个基础上可以实现文件发送吗?用readline()呵呵谢谢 我写的程序,你看看,不过我这个是客户端发送文件给服务器端后要打印这个文件的,你把程序再改改就可以了,希望有用!还用一点,我这个没有用线程做,你再改改!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); }} 呵呵,谢谢你的帮助,不过好象不太行.THANK YOU ALL THE SAME. 你用的是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(); 高手帮帮忙,憋的快休克了 求这样一种数据结构 有关html:file标签显示的问题(struts) java中文乱码问题 求教一个简单的servlet问题? 急!在servlet 和 jsp 中response.sendRedirect()怎么使用相对路径?? 还是编码的问题! 如何用查询语句获取一条记录是否是查询出来的记录集中的最后一条?在线等? 求达人给一个简单理解单文件上传到FTP的JSP例子,没有SERVLET的 RocketMQ3.2之后不能安装在Windows上? 正则表达式来过滤脏数据 jsp如何把一个vector传给servlet
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
}
}
接受端就自己设置了,用线程,或者消息都可以的
而且我的问题有点前提的,就是已经实现了聊天的功能,readline(),现在在这个基础上可以实现文件发送吗?
用readline()
呵呵
谢谢
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);
}
}
这个主要用来读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();