用TCP传输文件 我用TCP编了个聊天软件,想加入文件传输功能,就是在点击传输文件按钮时,对方能够弹出一个对话框是否同意接受。这个功能怎么样实现呢?小弟一时还想不起来啊,不知那个高手肯给予指点迷津啊?感谢了!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个我也做了..可以这样,先将文件名发送过去,用File类的isFile()进行判断,紧接着进行传输,再用length()方法判别文件长度,不为空则new一个JDialog,JDialog添加两个JButton,一个"是"一个"否",将JButton注册ActionListener事件监听,点击"是"按钮,用IO开始传输,点击"否"则不进行操作.程序找不到了..提供下思路. 我也这样做了,单是文件名怎么发给对方呐,用的是TCP。 你加入一个按钮,这个按钮注册一个弹出JFileChooser,具体可以这样:if(e.getActionCommand().equals("上传")){ //e是 Actionevent,"上传"是按钮的标签 JFileChooser fileChooser = new JFileChooser(); int i = fileChooser.showOpenDialog(this.sf); //sf.jd.setVisible(false); if(i==JFileChooser.APPROVE_OPTION){ File selectedFile = fileChooser.getSelectedFile(); JTextField tf = new JTextField(); tf.setText(selectedFile.getName()); sf.tf.setText(selectedFile.getAbsolutePath()); //获得文件路径,sf是聊天窗口,是个主类,sf.tf是sf中的一个JTextFiled,你从这儿得到的路径可以在sf.tf中显示,然后"发送"按钮就可以将文件名读进去,再传输到另一方. }}如果没看明白,可以继续问我. 嗯,这点我看明白了,多谢了。我的发送按钮是这样实现的:你请看private JButton getSendFileButton() { if (sendFileButton == null) { sendFileButton = new JButton(); sendFileButton.setUI(new BasicButtonUI()); sendFileButton.setToolTipText("传送文件"); sendFileButton.setIcon(new ImageIcon(getClass().getResource("/sendFile.png"))); sendFileButton.setBackground(new Color(212, 231, 245)); sendFileButton.setBounds(new Rectangle(237, 261, 38, 25)); sendFileButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(fs.changefile() == null) { //什么也不做 } else { sendSignle(fs.trueFileName); //发送一个信号 fs.startServerThread(); //用线程启动传送文件 } } }); sendFileButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseExited(java.awt.event.MouseEvent e) { sendFileButton.setBackground(new Color(212, 231, 245)); } public void mouseEntered(java.awt.event.MouseEvent e) { sendFileButton.setBackground(new Color(0, 150, 200)); } public void mousePressed(java.awt.event.MouseEvent e) { sendFileButton.setBackground(new Color(212, 231, 255)); } }); } return sendFileButton; }最关键的问题是:sendSignle(fs.trueFileName); //发送一个信号 这里出了问题,sendSingle()方法怎么样定义啊,我用的是TCP;其中trueFileName是要传输的文件名。 每个客户机都开一个serversocket,一旦一个客户机触发sendSignle事件,就请求另一个客户机的serversocket并建立连接线程(注意,一定要线程,否则没办法传多个文件),连接建立后由发送方将文件名传送给接受方,接受方收到请求后再显示相应的文件接收对话框,一旦允许接收并选择了存放的位置(发送同意接收信号给发送方),发送方此时开始从socket的outputstream中写入文件,而接受方从socket的inputstream中读取相关数据并写入文件。 五楼的大哥说的太对了,我就是按着这个思路进行的,现在最重要的是sendSingle()方法该如何实现,我用的是TCP。多谢了,俺在线等啊!!!!!!!!! 我觉得我已经说的很详细了,java中socket默认都是以tcp方式建立连接的,所以你不用管tcp或udp之类的底层协议,只要建立socket连接,就可以read来write去啦! 牛仔都很忙啊..将sendSignle(fs.trueFileName); 方法包装在一个"发送"按钮事件监听器类,在事件发生事调用我上面那段代码,不行么? 牛仔都很忙啊.. 将sendSignle(fs.trueFileName); 方法包装在一个"发送"按钮事件监听器类,在事件发生事调用我上面那段代码,不行么?[/Quote]我也做到这步了,fs.sendSignle(fs.trueFileName); //发送一个信号fs.startServerThread(); //用线程启动传送文件这个sendSingle();信号怎么样才能让通过服务器的另外一个客户端受到并响应呢?就差这一步啦!!!请多多帮忙啊!!!!万分感谢!!!!!!!!!!! 在大家的热情帮助下,我文件传输成功了。谢谢大家!!!! 我用的是C/S S/C模型,有一个客户端发送消息,经由服务器转发至每个客户端,所以,我在客户端发送信息的时候,加上本客户端的端口好,再由服务器转发,发至客户端时在将端口号分离出来,然后和自己的端口好比较,如果和自己的端口号相等就不做任何处理,不相等的话,就证明是传输文件的信号,就启动接受文件线程。接着建立,文件传输TCP连接。接着就可以传输文件啦! 最后还要感谢大家的热忱相助。 衷心的表示感谢!!! 请问构造方法不可以被调用吗? [超级新手提问]为什么不能在这里添加 Void java运行时处理文件路径的问题~~ 靠死,JAVA居然不支持创建泛型数组!!! 读取远程SQLSERVER的2进制字段在本地生成文件后,插入到本地ORACLE的LONG RAW字段报"数据大小超出此类型的最大值"错 请教:关于Arrays类的sort()方法,和arraycopy()方法,还有求导数的算法 读txt文件转码问题 关于extends和implements 想学JAVA但是一点不懂,求助! 第一次安装mysql!!! BorderLayout的问题 Java 如何通过TCP传输文件
可以这样,先将文件名发送过去,用File类的isFile()进行判断,紧接着进行传输,再用length()方法判别文件长度,不为空则new一个JDialog,JDialog添加
两个JButton,一个"是"一个"否",将JButton注册ActionListener事件监听,点击"是"按钮,用IO开始传输,点击"否"则不进行操作.
程序找不到了..提供下思路.
if(e.getActionCommand().equals("上传")){ //e是 Actionevent,"上传"是按钮的标签
JFileChooser fileChooser = new JFileChooser();
int i = fileChooser.showOpenDialog(this.sf);
//sf.jd.setVisible(false);
if(i==JFileChooser.APPROVE_OPTION){
File selectedFile = fileChooser.getSelectedFile();
JTextField tf = new JTextField();
tf.setText(selectedFile.getName());
sf.tf.setText(selectedFile.getAbsolutePath()); //获得文件路径,sf是聊天窗口,是个主类,sf.tf是sf中的一个JTextFiled,你从这儿得到的路径可以在sf.tf中显示,然后"发送"按钮就可以将文件名读进去,再传输到另一方.
}
}
如果没看明白,可以继续问我.
if (sendFileButton == null) {
sendFileButton = new JButton();
sendFileButton.setUI(new BasicButtonUI());
sendFileButton.setToolTipText("传送文件");
sendFileButton.setIcon(new ImageIcon(getClass().getResource("/sendFile.png")));
sendFileButton.setBackground(new Color(212, 231, 245));
sendFileButton.setBounds(new Rectangle(237, 261, 38, 25));
sendFileButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
if(fs.changefile() == null)
{
//什么也不做
}
else
{
sendSignle(fs.trueFileName); //发送一个信号 fs.startServerThread(); //用线程启动传送文件
}
}
});
sendFileButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseExited(java.awt.event.MouseEvent e) {
sendFileButton.setBackground(new Color(212, 231, 245));
}
public void mouseEntered(java.awt.event.MouseEvent e) {
sendFileButton.setBackground(new Color(0, 150, 200));
}
public void mousePressed(java.awt.event.MouseEvent e) {
sendFileButton.setBackground(new Color(212, 231, 255));
}
});
}
return sendFileButton;
}最关键的问题是:
sendSignle(fs.trueFileName); //发送一个信号
这里出了问题,sendSingle()方法怎么样定义啊,我用的是TCP;其中trueFileName是要传输的文件名。
将sendSignle(fs.trueFileName); 方法包装在一个"发送"按钮事件监听器类,在事件发生事调用我上面那段代码,不行么?
牛仔都很忙啊..
将sendSignle(fs.trueFileName); 方法包装在一个"发送"按钮事件监听器类,在事件发生事调用我上面那段代码,不行么?
[/Quote]我也做到这步了,fs.sendSignle(fs.trueFileName); //发送一个信号fs.startServerThread(); //用线程启动传送文件
这个sendSingle();信号怎么样才能让通过服务器的另外一个客户端受到并响应呢?
就差这一步啦!!!请多多帮忙啊!!!!万分感谢!!!!!!!!!!!
最后还要感谢大家的热忱相助。
衷心的表示感谢!!!