dtlzyyy 2017-03-18 00:55
浏览 361

为什么我的图片传输不了,但通信可以?

package com.example.socketserver;

import java.io.DataInputStream;
import java.io.File;

import java.io.BufferedInputStream;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.DataOutputStream;

import java.io.FileInputStream;

/**

  • 服务端
    *
    */
    public class SocketServer{

    public static void main(String[] args) {
    startService();
    }

    /**

    • 启动服务监听,等待客户端连接
      */
      private static void startService() {
      try {
      // 创建ServerSocket
      ServerSocket serverSocket = new ServerSocket(8888);
      System.out.println("--开启服务器,监听端口 8888--");

      // 监听端口,等待客户端连接
      while (true) {
          System.out.println("--等待客户端连接--");
          Socket socket = serverSocket.accept(); //等待客户端连接
          System.out.println("得到客户端连接:" + socket);
      
          startReader(socket);
      }
      

      } catch (IOException e) {
      e.printStackTrace();
      }
      }

    /**

    • 从参数的Socket里获取最新的消息
      */
      private static void startReader(final Socket socket) {

      new Thread(){
      @Override
      public void run() {
      DataInputStream reader;
      try {
      // 获取读取流
      reader = new DataInputStream( socket.getInputStream());
      while (true) {
      System.out.println("*等待客户端输入*");
      // 读取数据
      String msg = reader.readUTF();
      System.out.println("获取到客户端的信息:" + msg);
      }
      } catch (IOException e) {
      e.printStackTrace();
      }
      }

       public void start() {  
                  Socket s = null;  
                  try {  
                      ServerSocket ss = new ServerSocket(8888);  
                      while (true) {  
                          // 选择进行传输的文件  
                          String filePath = "D:/downloads/q.jpg";  
                          File fi = new File(filePath);  
      
                          System.out.println("文件长度:" + (int) fi.length());  
      
                          // public Socket accept() throws  
                          // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。  
      
                          s = ss.accept();  
                          System.out.println("建立socket链接");  
                          DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));  
                          dis.readByte();  
      
                          DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));  
                          DataOutputStream ps = new DataOutputStream(s.getOutputStream());  
                          //将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。  
                          ps.writeUTF(fi.getName());  
                          ps.flush();  
                          ps.writeLong((long) fi.length());  
                          ps.flush();  
      
                          int bufferSize = 8192;  
                          byte[] buf = new byte[bufferSize];  
      
                          while (true) {  
                              int read = 0;  
                              if (fis != null) {  
                                  read = fis.read(buf);  
                              }  
      
                              if (read == -1) {  
                                  break;  
                              }  
                              ps.write(buf, 0, read);  
                          }  
                          ps.flush();  
                          // 注意关闭socket链接哦,不然客户端会等待server的数据过来,  
                          // 直到socket超时,导致数据不完整。                  
                          fis.close();  
                          s.close();                  
                          System.out.println("文件传输完成");  
                      }  
      
                  } catch (Exception e) {  
                      e.printStackTrace();  
                  }  
              }  
      

      }.start();
      }

      }

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题