Android的图像发送通过套接字失败:" client.getOutputStream()"不工作 [英] Android sending image over socket fails: "client.getOutputStream()" does not work

查看:384
本文介绍了Android的图像发送通过套接字失败:" client.getOutputStream()"不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不能得到这个code的工作,特别是指令的OutputStream = client.getOutputStream();似乎没有工作,我想不通为什么。任何帮助将大大AP preciated,在此先感谢球员

 公共类FileActivity延伸活动{私人的FileInputStream的FileInputStream;
 私人的BufferedInputStream的BufferedInputStream;
 私人的OutputStream的OutputStream;私人字节[] mybytearray;私人字符串TMP = NULL;私人TextView的电视;私人myfile文件;私人诠释升;私人字符串路径;私人的EditText EDITTEXT;私人的ServerSocket ServerSocket的;私人客户端的Socket;公共静态字符串SERVERIP =10.0.2.15;私人最终诠释SERVERPORT = 8080;私人字节[] imgbyte;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_file);    电视=(的TextView)findViewById(R.id.textView1);
    EDITTEXT =(EditText上)findViewById(R.id.editText1);    SERVERIP = getLocalIpAddress();    螺纹sThread =新主题(新ServerThread());
    sThread.start();
}公共无效sendListener(视图v){    TMP = editText.getText()的toString()。    PATH =/ SD卡/+ TMP;    MYFILE =新的文件(路径); Log.d(服务器,工程);    L =(INT)myFile.length(); Log.d(服务器,工程);    tv.setText(路径++ Integer.toString(1));    TMP = Integer.toString(升); Log.d(服务器,工程);    字符串测试= tmp目录;    //out.println(tmp);
    Log.d(服务器,工程);
    尝试{        为PrintWriter了=的新PrintWriter(新的BufferedWriter(新OutputStreamWriter(client.getOutputStream())),TRUE);
        通过out.println(试验);
        out.close();
        Log.d(服务器,工程);
        字节[] = mybytearray新的字节[L]; //创建一个字节数组到文件
        Log.d(服务器,工程);
        的FileInputStream =新的FileInputStream(MYFILE);
         的BufferedInputStream =新的BufferedInputStream(的FileInputStream);
         Log.d(服务器,工程);         bufferedInputStream.read(mybytearray,0,mybytearray.length); //读取文件
         Log.d(服务器,工程);
         尝试{
             的OutputStream = client.getOutputStream();
         }赶上(例外五)
         {
             Log.d(输出,UFFFF);
         }
         Log.d(服务器,差不多);
         outputStream.write(mybytearray,0,mybytearray.length); Log.d(服务器,DONE); //写文件由字节输出流字节
        / * outputStream.flush();
         尝试{
             的OutputStream = client.getOutputStream();
         }赶上(例外五)
         {
             Log.d(输出,UFFFF);
         } * /       / *
         Log.d(SERVER,FUUUNZIONAAAA);
         诠释计数= 0;         而((计数= bufferedInputStream.read(mybytearray,0,mybytearray.length))!= -1)
         {
             Log.d(SERVER,FINEEEE);
             outputStream.write(mybytearray,0,计数);
             Log.d(TEST,Integer.toString(计数));
         }
         Log.d(SERVER,FINEEEE);
         bufferedInputStream.close();
         outputStream.close();
               client.close(); * /
    }赶上(例外五){    }        / *
    }    Log.d(SERVER,FUUUNZIONAAAA);
    tv.setText(路径++ Integer.toString(1));    尝试{
        OUT =的新PrintWriter(新的BufferedWriter(新OutputStreamWriter(client.getOutputStream())),TRUE);
        FIS =新的FileInputStream(文件);
        双=新的BufferedInputStream(FIS);
        OS = client.getOutputStream();
    }赶上(IOException异常E1){
        // TODO自动生成catch块
        e1.printStackTrace();
    }    尝试{
        字节[] = mybytearray新的字节[L];
        Log.d(SERVER,FUUUNZIONAAAA);        Log.d(SERVER,FUUUNZIONAAAA);
        通过out.println(Integer.toString(1));
        Log.d(SERVER,INVIATO0);        INT read_count = 0;
        而((read_count = bis.read(mybytearray,0,mybytearray.length))!= - 1){
            os.write(mybytearray,0,read_count); //现在写入正确的字节数量
        }        Log.d(SERVER,INVIATO1);        out.close();
        fis.close();
        bis.close();
        os.close();
    }赶上(IOException异常五){
        // TODO自动生成catch块
        e.printStackTrace();
    } * /
}
公共类ServerThread实现Runnable {    @覆盖
    公共无效的run(){
        // TODO自动生成方法存根
        尝试{
            ServerSocket的=新的ServerSocket(SERVERPORT);
            客户=的ServerSocket.accept();
            //的OutputStream = client.getOutputStream();            Log.d(SERVER,Connesso);
        }赶上(IOException异常五){
            // TODO自动生成catch块
            e.printStackTrace();
            Log.d(TEST,UFFFAAA);
        }
    }}私人字符串getLocalIpAddress(){    字符串TMP =;    INT I = 0;    尝试{
        对于(枚举<&NetworkInterface的GT; EN = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();){
            NetworkInterface的INTF = en.nextElement();
            为(枚举&所述;为InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements()){
                InetAddress类InetAddress类= enumIpAddr.nextElement();
                如果(!inetAddress.isLoopbackAddress())
                {                    TMP + =IP:+ inetAddress.getHostAddress()+\\ n;                }
            }
        }
    }赶上(SocketException前){
        Log.e(ServerActivity,ex.toString());
    }
    返回TMP;
}@覆盖
保护无效的onStop(){
    super.onStop();
    尝试{
         serverSocket.close();
     }赶上(IOException异常五){
         e.printStackTrace();
     }
}

}

这是我得到的错误

  1月6日至25日:01:41.504:W / System.err的(22561):产生java.net.SocketException:套接字关闭1月6日至25日:01:41.504:
在java.net.PlainSocketImpl.checkNotClosed(PlainSocketImpl.java)1月6日至25日:01:41.504:
在java.net.PlainSocketImpl.getOutputStream(PlainSocketImpl.java)1月6日至25日:01:41.504:
在java.net.Socket.getOutputStream(Socket.java)1月6日至25日:01:41.504:
在com.illiano.esameserver.FileActivity.sendListener(FileActivity.java:120)1月6日至25日:01:41.504:
在java.lang.reflect.Method.invokeNative(本机方法)1月6日至25日:01:41.504:
在java.lang.reflect.Method.invoke(Method.java)1月6日至25日:01:41.504:
在android.view.View $ 1.onClick(View.java)1月6日至二十五日:01:41.504:
在android.view.View.performClick(View.java)一月六日至25日:01:41.504:
在android.view.View $ PerformClick.run(View.java)1月6日至25日:01:41.504:
在android.os.Handler.handleCallback(Handler.java)1月6日至25日:01:41.504:
在android.os.Handler.dispatchMessage(Handler.java)1月6日至25日:01:41.504:
在android.os.Looper.loop(Looper.java)1月6日至25日:01:41.504:
在android.app.ActivityThread.main(ActivityThread.java)1月6日至25日:01:41.504:
在java.lang.reflect.Method.invokeNative(本机方法)1月6日至25日:01:41.504:
在java.lang.reflect.Method.invoke(Method.java)1月6日至25日:01:41.504:
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)1月6日至25日:01:41.504:
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java)1月6日至25日:01:41.504:
在de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)1月6日至25日:01:41.504:
在dalvik.system.NativeStart.main(本机方法)


解决方案

 产生java.net.SocketException:套接字关闭

表示的的关闭套接字,然后继续使用它。

可能你没有意识到关闭套接字的输入流或者输出流关闭其他流和插座

I can't get this code to work, in particular, the instruction "outputStream = client.getOutputStream();" does not seem to work and I can't figure out why. Any help will be much appreciated, thanks in advance guys

public class FileActivity extends Activity {

private FileInputStream fileInputStream;
 private BufferedInputStream bufferedInputStream;
 private OutputStream outputStream;

private byte [] mybytearray;

private String tmp = null;

private TextView tv;

private File myFile;

private int l;

private String path;

private EditText editText;

private ServerSocket serverSocket;

private Socket client;

public static String SERVERIP = "10.0.2.15";

private final int SERVERPORT = 8080;

private byte [] imgbyte;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file);

    tv = (TextView) findViewById(R.id.textView1);
    editText = (EditText) findViewById(R.id.editText1);

    SERVERIP = getLocalIpAddress();

    Thread sThread = new Thread(new ServerThread());
    sThread.start();
}

public void sendListener(View v) {

    tmp = editText.getText().toString();

    path = "/sdcard/" + tmp;

    myFile = new File(path);Log.d("SERVER", "WORKS");           

    l = (int) myFile.length();Log.d("SERVER", "WORKS");

    tv.setText(path + "  " + Integer.toString(l));  

    tmp = Integer.toString(l);  Log.d("SERVER", "WORKS");

    String test = tmp;



    //out.println(tmp);
    Log.d("SERVER", "WORKS");
    try {

        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
        out.println(test);
        out.close();
        Log.d("SERVER", "WORKS");
        byte[] mybytearray = new byte[l]; //create a byte array to file
        Log.d("SERVER", "WORKS");
        fileInputStream = new FileInputStream(myFile);
         bufferedInputStream = new BufferedInputStream(fileInputStream);  
         Log.d("SERVER", "WORKS");

         bufferedInputStream.read(mybytearray, 0, mybytearray.length); //read the file
         Log.d("SERVER", "WORKS");
         try{
             outputStream = client.getOutputStream();
         } catch(Exception e)
         {
             Log.d("OUTPUT", "UFFFF");
         }
         Log.d("SERVER", "ALMOST");
         outputStream.write(mybytearray, 0, mybytearray.length); Log.d("SERVER", "DONE");//write file to the output stream byte by byte
        /* outputStream.flush();
         try{
             outputStream = client.getOutputStream();
         } catch(Exception e)
         {
             Log.d("OUTPUT", "UFFFF");
         }*/

       /*  
         Log.d("SERVER", "FUUUNZIONAAAA");
         int count = 0;

         while((count = bufferedInputStream.read(mybytearray, 0 , mybytearray.length)) != -1)
         {
             Log.d("SERVER", "FINEEEE");
             outputStream.write(mybytearray, 0, count);
             Log.d("TEST", Integer.toString(count));
         }
         Log.d("SERVER", "FINEEEE");
         bufferedInputStream.close();
         outputStream.close();
               client.close();*/
    } catch (Exception e) {

    }

        /*
    }

    Log.d("SERVER", "FUUUNZIONAAAA");
    tv.setText(path + "  " + Integer.toString(l));      

    try {
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
        fis = new FileInputStream(file);
        bis = new BufferedInputStream(fis);
        os = client.getOutputStream();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    try {   
        byte [] mybytearray  = new byte[l]; 
        Log.d("SERVER", "FUUUNZIONAAAA");

        Log.d("SERVER", "FUUUNZIONAAAA");
        out.println(Integer.toString(l));
        Log.d("SERVER", "INVIATO0");

        int read_count = 0;
        while ((read_count = bis.read(mybytearray, 0, mybytearray.length)) != -1) {
            os.write(mybytearray, 0, read_count); // Now writes the correct amount of bytes
        }

        Log.d("SERVER", "INVIATO1");

        out.close();
        fis.close();
        bis.close();
        os.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } */


}


public class ServerThread implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            serverSocket = new ServerSocket(SERVERPORT);
            client = serverSocket.accept();
            //outputStream = client.getOutputStream();

            Log.d("SERVER", "Connesso");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("TEST", "UFFFAAA");
        }           
    }

}

private String getLocalIpAddress() {

    String tmp = "";

    int i = 0;

    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) 
                { 

                    tmp += "IP: " + inetAddress.getHostAddress() + "\n"; 

                }
            }
        }
    } catch (SocketException ex) {
        Log.e("ServerActivity", ex.toString());
    }
    return tmp;
}

@Override
protected void onStop() {
    super.onStop();
    try {
         serverSocket.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
}

}

This is the error I'm getting

06-25 01:01:41.504: W/System.err(22561): java.net.SocketException: Socket is closed 06-25 01:01:41.504:
at java.net.PlainSocketImpl.checkNotClosed(PlainSocketImpl.java) 06-25 01:01:41.504:
at java.net.PlainSocketImpl.getOutputStream(PlainSocketImpl.java) 06-25 01:01:41.504:
at java.net.Socket.getOutputStream(Socket.java) 06-25 01:01:41.504:
at com.illiano.esameserver.FileActivity.sendListener(FileActivity.java:120) 06-25 01:01:41.504:
at java.lang.reflect.Method.invokeNative(Native Method) 06-25 01:01:41.504:
at java.lang.reflect.Method.invoke(Method.java) 06-25 01:01:41.504:
at android.view.View$1.onClick(View.java) 06-25 01:01:41.504:
at android.view.View.performClick(View.java) 06-25 01:01:41.504:
at android.view.View$PerformClick.run(View.java) 06-25 01:01:41.504:
at android.os.Handler.handleCallback(Handler.java) 06-25 01:01:41.504:
at android.os.Handler.dispatchMessage(Handler.java) 06-25 01:01:41.504:
at android.os.Looper.loop(Looper.java) 06-25 01:01:41.504:
at android.app.ActivityThread.main(ActivityThread.java) 06-25 01:01:41.504:
at java.lang.reflect.Method.invokeNative(Native Method) 06-25 01:01:41.504:
at java.lang.reflect.Method.invoke(Method.java) 06-25 01:01:41.504:
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 06-25 01:01:41.504:
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 06-25 01:01:41.504:
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 06-25 01:01:41.504:
at dalvik.system.NativeStart.main(Native Method)

解决方案

java.net.SocketException: Socket is closed

means that you closed the socket and then continued to use it.

Possibly you are unaware that closing the input stream or output stream of a socket closes the other stream and the socket.

这篇关于Android的图像发送通过套接字失败:&QUOT; client.getOutputStream()&QUOT;不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆