社区
Web 开发
帖子详情
SOCKET怎么发送文件?
kunmengzi
2006-08-17 12:10:16
用socket编写了一个聊天程序,请问怎么才能实现文件的发送?
用输入输出流只能输出一行一行的语句啊,字符串string……
怎么才能实现一个文件的打包传送。
谢谢各位。
...全文
564
9
打赏
收藏
SOCKET怎么发送文件?
用socket编写了一个聊天程序,请问怎么才能实现文件的发送? 用输入输出流只能输出一行一行的语句啊,字符串string…… 怎么才能实现一个文件的打包传送。 谢谢各位。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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++ @_@
SparkSQL三种数据源的load与save——本地&HDFS、JDBC、Hive数据库
SparkSQL,通俗来讲就是将DataFrame构建一张临时表,然后去用sql语言查询这张临时表 DF.createOrReplaceTempView("XX表名") spark.sql("select * from XX表名").show 与Hive将HQL转化成MapReduce然后提交到集群中执行类似,SparkSQL是转化成了RDD,提交到集群中用Spark来执行。Spark的运算...
SparkSQL数据源之Hive数据库
Apache Hive是Hadoop上的SQL引擎,Spark SQL编译时可以包含Hive支持,也可以不包含。包含Hive支持的Spark SQL可以支持Hive表访问、UDF(用户自定义函数)以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在Spark SQL中包含Hive的库,并不需要事先安装Hive。一般来说,最好还是在编译Spark SQL时引入Hive支持,...
spark连接不了本地hive_SparkSQL数据源之Hive数据库
Apache Hive是Hadoop上的SQL引擎,Spark SQL编译时可以包含Hive支持,也可以不包含。包含Hive支持的Spark SQL可以支持Hive表访问、UDF(用户自定义函数)以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在Spark SQL中包含Hive的库,并不需要事先安装Hive。一般来说,最好还是在编译Spark SQL时引入Hi...
spark-sql如何删除表_SparkSQL数据源之Hive数据库
Apache Hive是Hadoop上的SQL引擎,Spark SQL编译时可以包含Hive支持,也可以不包含。包含Hive支持的Spark SQL可以支持Hive表访问、UDF(用户自定义函数)以及 Hive 查询语言(HiveQL/HQL)等。需要强调的一点是,如果要在Spark SQL中包含Hive的库,并不需要事先安装Hive。一般来说,最好还是在编译Spark SQL时引入Hi...
sparksql使用hive数据源保存在mysql数据库
//导入包并配置 hive数据源 val spark = SparkSession.builder() .master(“local”) .appName(“AreaTopNRoadFlowAnalyzer”) .config(“fs.defaultFS”, “hdfs://ip:9000”) //数据存放位置 .config(“spark.sql.warehouse.dir”, “hdfs://ip:9000/test”) .enableHiveSupport() .getOrCreate() spark
Web 开发
81,108
社区成员
341,721
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章