社区
Web 开发
帖子详情
SOCKET怎么发送文件?
kunmengzi
2006-08-17 12:10:16
用socket编写了一个聊天程序,请问怎么才能实现文件的发送?
用输入输出流只能输出一行一行的语句啊,字符串string……
怎么才能实现一个文件的打包传送。
谢谢各位。
...全文
457
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++ @_@
Android基于
Socket
聊天最终版
Android之基于
socket
聊天小项目,包含服务器、客户端、数据库
文件
以及个人测试的截图。最后一次修改了,开始上班了,不弄了,谢谢大家。
C#高性能大容量
SOCKET
并发完成端口例子(有C#客户端)完整实例源码
例子主要包括
Socket
AsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程
文件
流、吞吐量协议,用于测试
Socket
AsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度...
基于c#
socket
udp的简单的局域网聊天软件 含源码
基于c#
socket
udp的简单的局域网聊天软件
文件
中有两个版本 一个是devexpress开发的(ITalk) 其实没啥特殊的效果 怕网友打不开 就重新再普通的winform(ITalkTradition)里面复制了一个
C++使用TCP
SOCKET
发送
超大
文件
(超过2G)
C++使用TCP
SOCKET
发送
超大
文件
(超过2G) 前几天有一个网友提出问题,如何使用
socket
传输超大
文件
。 之前虽然知道理论上该怎么处理,但并未在实际工作中使用过,毕竟现成的工具实在是太多了,没有自己开发的必要。...
Android
Socket
传输
文件
创建一个按钮,在按钮监听器中设置
文件
路径、
文件
名、IP地址以及端口号,然后开启一个线程执行SendFile()方法进行
Socket
文件
发送
。在SendFile()方法中,
文件
名和
文件
数据分别用name和data两个
socket
进行
发送
。 ...
Web 开发
81,094
社区成员
341,711
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章