黑马程序员技术交流社区

标题: UDP协议下如何传输文件? [打印本页]

作者: _J2EE_LiXiZhen    时间: 2017-11-26 22:43
标题: UDP协议下如何传输文件?
我的文件可以传输但是大小会比源文件多些字节,还有就是无法让服务器读到停止标签,付源码,望大神多多提点~~~

客户端代码:
[Java] 纯文本查看 复制代码
public class UDP_Send {
        public static void main(String[] args) throws IOException {

                // 创建输入流,将客户端本地文件读到内存
                FileInputStream in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\b.png");

                // 创建packet包装数据
                byte[] b = new byte[1024];
                while (true) {
                        int len = in.read(b);
                        if (len != -1) {
                                // 使用客户端随机端口向服务器传输信息
                                DatagramSocket ds_send = new DatagramSocket();
                                DatagramPacket dp_send = new DatagramPacket(b, len, InetAddress.getLocalHost(), 45667);
                                // 向服务器发送数据包
                                ds_send.send(dp_send);
                                ds_send.close();
                        }else {
                                // 向服务器传入结束标签
                                 DatagramSocket ds_send = new DatagramSocket();
                                 byte[] end = "end".getBytes();
                                 DatagramPacket dp_send = new DatagramPacket(end, end.length, InetAddress.getLocalHost(), 45667);
                                 ds_send.send(dp_send);
                                 ds_send.close();
                                 break;
                        }
                }
                in.close();
                System.out.println("正在上传....");
                // 创建DatagramSocket接收服务器反馈<接收端口46667>
                DatagramSocket ds_receive = new DatagramSocket(46667);
                byte[] message = new byte[1024];
                DatagramPacket dp_receive = new DatagramPacket(message, message.length);
                // 接收响应
                ds_receive.receive(dp_receive);
                // 解析到控制台
                byte[] result = dp_receive.getData();
                System.out.println(new String(result));
                // 关流
                ds_receive.close();
        }
}


服务器端代码:
[Java] 纯文本查看 复制代码
public class UDP_Receive {
        public static void main(String[] args) throws SocketException, IOException {
                System.out.println("服务器开启.....");

                // 创建输出流,将内存文件保存到服务器硬盘
                FileOutputStream out = new FileOutputStream(System.currentTimeMillis() + ".png");

                // 创建DatagramSocket指定接收端口
                DatagramSocket ds_receive = new DatagramSocket(45667);
                byte[] receive = new byte[1024];
                DatagramPacket dp_receive = new DatagramPacket(receive, receive.length);

                System.out.println("等待上传...");
                // 接收客户端数据,遇到结束标签退出
                while (true) {
                        ds_receive.receive(dp_receive);//最后一步读到这里停止了
                        byte[] b = dp_receive.getData();
                        String data = new String(b);
                        // 判断是否结束
                        if (data.trim().endsWith("end")) {
                                ds_receive.close();
                                break;
                        }
                        // System.out.println(data);不写这句话正常
                        // 文件写到硬盘
                        out.write(b);
                }
                // 关闭流
                out.close();
                ds_receive.close();
                System.out.println("保存成功!");

                // 向客户端发送响应信息
                DatagramSocket ds_send = new DatagramSocket();
                byte[] message = "上传成功!".getBytes();
                DatagramPacket dp_send = new DatagramPacket(message, message.length, InetAddress.getLocalHost(), 46667);
                ds_send.send(dp_send);
                // 关流
                ds_send.close();
        }
}

作者: _J2EE_LiXiZhen    时间: 2017-11-27 23:15
问题已解决!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2