Android Studioでソケット通信のプログラムを組み、Android端末間で画像を転送するプログラムを作ろうとしています。手始めとしてクライアントから一回サーバーに送信するだけのプログラムです。
文章を送るプログラムを以前に自分で書いたので、そのコピーを改造して作っています。
しかし、実機デバッグがうまくいきません。
具体的には、サーバー側のonPostExecute()で、成功した時に表示する__"Succeeded! Sabrina Carpenter..."__がちゃんと画面に表示されますが、肝心の画像が表示されません。
パーミッションは問題ないはずです。
実機はそれぞれ Android 10, 9 の端末間での通信です。
考えられるのは
・クライアント側での ImageView -> byte[] の変換が間違っている
・サーバー側での byte[] -> Drawable の変換が間違っている
・byte[] 列が正しく送られていない
のどれかです。
以下問題のコードです。
#クライアントのプロジェクト
myClass.java
Java
1//AsyncTask doInBackgroundの引数になるオブジェクト 2public class myClass{ 3 public String string; 4 public byte[] bytes; 5 6 public myClass(String s, byte[] b){ 7 this.string = s; 8 this.bytes = b; 9 } 10}
MainActivity.java
public class MainActivity extends AppCompatActivity { ImageView image1; Button button1; String IPAddress; Activity activity; EditText editText; TextView tv; byte[] buff; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //widget image1= (ImageView)this.findViewById(R.id.imageSabrina); button1 = (Button)this.findViewById(R.id.button1); activity = this; editText = (EditText)this.findViewById(R.id.textInput); tv = (TextView)activity.findViewById(R.id.tview1); buff = new byte[200000]; button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Drawable drawable = image1.getDrawable(); //ImageViewをbyte[]に変換 try { ByteArrayOutputStream byteos = new ByteArrayOutputStream(); ObjectOutputStream objos = new ObjectOutputStream(byteos); objos.writeObject(drawable); objos.close(); buff = byteos.toByteArray(); byteos.close(); } catch (IOException e) { e.printStackTrace(); tv.setText(e.toString()); } IPAddress = ""; IPAddress += editText.getText().toString(); myClass info = new myClass(IPAddress, buff); //ソケットの実行 if(IPAddress != "") new ClientSock(activity).execute(info); else { tv.setText("error : ↓SetIP here"); } } }); } }
ClientSock.java
Java
1public class ClientSock extends AsyncTask<myClass, Void, String> { 2 private Activity activity; 3 DataOutputStream writer; 4 5 public ClientSock(Activity activity1){ activity = activity1; } 6 7 @Override 8 protected String doInBackground(myClass... info){ 9 InetSocketAddress endpoint = new InetSocketAddress(info[0].string, 12345); 10 11 //ソケットを生成しDataOutputStreamで送信処理 12 try{ 13 Socket sock = new Socket(); 14 sock.connect(endpoint); 15 writer = new DataOutputStream(sock.getOutputStream()); 16 writer.write(info[0].bytes, 0, info[0].bytes.length); 17 sock.close(); 18 return "Succeeded in sending a message to " + info[0].string; 19 }catch(IOException e){ 20 return e.toString() + "\nfailed to send a message to " + info[0].string; 21 } 22 } 23 24 @Override 25 protected void onPostExecute(String s){ 26 TextView tv = (TextView)activity.findViewById(R.id.tview1); 27 tv.setText(s); 28 } 29}
サーバーのプロジェクト
MainActivity.java
Java
1public class MainActivity extends AppCompatActivity { 2 Button button; 3 Activity activity; 4 ImageView imageView; 5 Drawable drawable; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 12 //widget 13 button = (Button)this.findViewById(R.id.button); 14 activity = this; 15 imageView = (ImageView)this.findViewById(R.id.receivedPicture); 16 17 button.setOnClickListener(new View.OnClickListener() { 18 @Override 19 public void onClick(View v) { 20 //ソケットの実行 21 new ServerSock(activity).execute(); 22 } 23 }); 24 } 25}
######ServerSock
Java
1public class ServerSock extends AsyncTask<Void, Void, Drawable> { 2 private Activity activity; 3 InputStream input; 4 ImageView imageView; 5 TextView textView; 6 7 public ServerSock(Activity activity1){ activity = activity1; } 8 9 @Override 10 protected Drawable doInBackground(Void... voids) { 11 textView = (TextView) activity.findViewById(R.id.textview); 12 try { 13 //ソケットを生成し、InputStreamで通信処理 14 ServerSocket SS = new ServerSocket(12345); 15 Socket sock = SS.accept(); 16 input = new BufferedInputStream(sock.getInputStream()); 17 18 byte[] b = new byte[200000]; 19 byte[] tem = new byte[1024]; 20 int a; 21 int count = 0; 22 23 //byte配列を読み込む 24 while((a = input.read(tem)) > -1){ 25 for(int i = 0; i < a; i++) b[count + i] = tem[i]; 26 count += a; 27 } 28 input.close(); 29 sock.close(); 30 31 //byte[]を Drawableに変換 32 ByteArrayInputStream byteis = new ByteArrayInputStream(b, 0, count); 33 ObjectInputStream objis = new ObjectInputStream(byteis); 34 Drawable drawable = (Drawable) objis.readObject(); 35 return drawable; 36 } catch (IOException | ClassNotFoundException e) { 37 e.printStackTrace(); 38 return null; 39 } 40 } 41 42 @Override 43 protected void onPostExecute(Drawable drawable) { 44 //Drawableを imageviewにセット 45 imageView = (ImageView) activity.findViewById(R.id.receivedPicture); 46 imageView.setImageDrawable(drawable); 47 textView.setText("Succeeded! Sabrina Carpenter..."); 48 } 49}
ご返答お待ちしています。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー