繁体   English   中英

使用套接字服务器/客户端传输文件

[英]Transfer file using Sockets Server/Client

嗨,我有2个类别,以便将文件推送到android设备中。

我的服务器CLass:

    public class FileServer {
      public static void main (String [] args ) throws IOException {
        // create socket
        ServerSocket servsock = new ServerSocket(13267);
        while (true) {
          System.out.println("Waiting...");

          Socket sock = servsock.accept();
          System.out.println("Accepted connection : " + sock);

          // sendfile
          File myFile = new File ("C:\\Users\\Petrica\\Desktop\\zzz.txt");
          byte [] mybytearray  = new byte [(int)myFile.length()];
          FileInputStream fis = new FileInputStream(myFile);
          BufferedInputStream bis = new BufferedInputStream(fis);
          bis.read(mybytearray,0,mybytearray.length);
          OutputStream os = sock.getOutputStream();
          System.out.println("Sending...");
          os.write(mybytearray,0,mybytearray.length);
          os.flush();
          sock.close();
          }
        }
    }

And my Client Class:

public class TCPClient extends AsyncTask{
@Override
protected Object doInBackground(Object... params) {
    int filesize=6022386; // filesize temporary hardcoded

    long start = System.currentTimeMillis();
    int bytesRead;
    int current = 0;
    // localhost for testing
    Socket sock = null;
    try {
        sock = new Socket("127.0.0.1",13267);
    } catch (UnknownHostException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.println("Connecting...");

    // receive file
    try {
    byte [] mybytearray  = new byte [filesize];
    InputStream is = sock.getInputStream();
    FileOutputStream fos = new FileOutputStream("/mnt/sdcard/zzz.txt");
    BufferedOutputStream bos = new BufferedOutputStream(fos);

        bytesRead = is.read(mybytearray,0,mybytearray.length);


    current = bytesRead;

    // thanks to A. Cádiz for the bug fix
    do {
       bytesRead =
          is.read(mybytearray, current, (mybytearray.length-current));
       if(bytesRead >= 0) current += bytesRead;
    } while(bytesRead > -1);

    bos.write(mybytearray, 0 , current);
    bos.flush();
    long end = System.currentTimeMillis();
    System.out.println(end-start);
    bos.close();
    sock.close();
    // TODO Auto-generated method stub

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
    return null;
}
}

我得到一个错误

    09-09 15:52:39.261: E/AndroidRuntime(802): FATAL EXCEPTION: AsyncTask #1
09-09 15:52:39.261: E/AndroidRuntime(802): java.lang.RuntimeException: An error occured while executing doInBackground()
09-09 15:52:39.261: E/AndroidRuntime(802):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.util.concurrent.FutureTask.run(FutureTask.java:239)
09-09 15:52:39.261: E/AndroidRuntime(802):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.lang.Thread.run(Thread.java:841)
09-09 15:52:39.261: E/AndroidRuntime(802): Caused by: java.lang.NullPointerException
09-09 15:52:39.261: E/AndroidRuntime(802):  at com.aaaaaa.TCPClient.doInBackground(TCPClient.java:33)
09-09 15:52:39.261: E/AndroidRuntime(802):  at com.aaaaaa.TCPClient.doInBackground(TCPClient.java:1)
09-09 15:52:39.261: E/AndroidRuntime(802):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-09 15:52:39.261: E/AndroidRuntime(802):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
09-09 15:52:39.261: E/AndroidRuntime(802):  ... 4 more

主要活动:

  public class MainActivity extends Activity {
    TCPClient tcpc;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
            Button btn = (Button) findViewById(R.id.send_button);
            btn.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
            tcpc.execute();
                }
            });
        }


}

有谁知道我该怎么办??? 以后我想发送2个文件:D。谢谢。

确实希望您能够解决自己的NullPointerExceptions:至少我期望如此,但是当您超过了该限制时,您的复制代码就出错了。 您目前正在忽略read()返回的计数,并假定它已填充缓冲区。 不能保证做到这一点。 请参阅Javadoc。

while ((count = in.read(buffer)) > 0)
{
   out.write(buffer, 0, count);
}

在两端使用此值,且缓冲区大小> 0,通常为8192。

我不认为您的Socket正在连接,但是很难说。 在您的日志输出中,它说是由doInBackground()第33行引起的NullPointerException。您应该在编辑器中检查第33行,更好的是,在您的帖子中向我们显示哪一行是33。我有点叫您将Socket袜子称为= null ;,然后尝试在try块中实例化一个新的Socket,但是失败了,所以sock仍然== null,然后在sock和boom上调用NPE的方法。

如果您正在计算机上运行服务器,而在Android设备上运行AsyncTask,则将无法尝试连接到本地主机(127.0.0.1)。 相反,您应该尝试连接到计算机的内部网络ip(例如192.168.1.XXX),前提是两个设备都在WiFi上。 如果您正在运行android仿真器,则127.0.0.1将返回到仿真设备,并且所有仿真器会话都在仿真路由器上运行,您必须先配置该仿真路由器以进行端口转发,然后才能引用开发机,请参见此处- > http://developer.android.com/tools/devices/emulator.html#emulatornetworking

正如Andras Balazs Lajtha所说,TCPClient似乎从未在onCreate()期间初始化/创建过,而只是声明了。 由于您的logcat输出显示了来自TCPClient的错误,因此我假设您已经在实际运行该代码。

通常,当您发布涉及特定代码行问题的日志输出时,应从此处开始,并在发布时告诉我们或告诉我们哪一行。 当然,如果第33行与空Socket对象无关,那么我就没有多大帮助了:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM