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

Java 使用套接字服务器/客户端传输文件,java,android,Java,Android,大家好,我有两个类来将文件推送到android设备中 我的服务器类: public class FileServer { public static void main (String [] args ) throws IOException { // create socket ServerSocket servsock = new ServerSocket(13267); while (true) { S

大家好,我有两个类来将文件推送到android设备中

我的服务器类:

    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();
                }
            });
        }


}

有人知道我该怎么做吗???将来我想发送两个文件:D.谢谢你的建议。

我认为你的插座没有连接,但很难说。在日志输出中,它显示由doInBackground()行引起的NullPointerException。您应该在编辑器中检查第33行,更好的是,在您的帖子中显示哪一行是33。我有种感觉,你把Socket sock=null;,然后尝试在try块中实例化一个新套接字,但失败了,所以sock仍然==null,然后在sock上调用一个方法,boom,NPE

如果在计算机上运行服务器,在Android设备上运行AsyncTask,则无法尝试连接到localhost(127.0.0.1)。相反,您应该尝试连接到计算机的内部网络ip(类似于192.168.1.XXX),假设两个设备都在WiFi上。如果您运行的是android仿真器,那么127.0.0.1将引用回模拟设备,并且所有仿真器会话都将在模拟路由器上运行,在引用开发机器之前,您必须对其进行端口转发配置,请参见此处-->

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


一般来说,当您发布涉及特定代码行的问题的日志输出时,您应该从那里开始,并且在发布时,告诉我们或向我们显示这是哪一行。当然,如果第33行与空套接字对象无关,那么我就没有什么帮助:)

你真的应该能够整理出你自己的
nullpointerException:
至少我是这样认为的,但是当你处理完这个问题后,你的复制代码就错了。您当前正在忽略
read()
返回的计数,并假设它已填充缓冲区。这并不能保证做到这一点。请参阅Javadoc

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

在两端使用此选项,任何缓冲区大小都大于0,通常为8192。

首先,检查您的活动,因为它会引发空指针异常。在我的活动中,我有一个按钮,单击该按钮会执行我的doinbackground方法。在onCreate()期间,活动的第15行会发生什么?也许你可以包括onCreate?你可以上传整个服务器类的java文件吗?在设置onClickListener之前,你是否正确初始化了你的按钮?正确的顺序是:1。setContentView 2。查找视图3。检查返回的视图是否为空4。setOnClickListener