![](/img/trans.png)
[英]File Transfer from Server to Client using java sockets. Error on Server side and File transferred to client is empty
[英]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.