내가 만들고있어 소켓 통신을 사용하는 안드로이드 응용 프로그램이 컴퓨터 여기SocketException - 사용하고는, isConnected()가
에서 실행되는 자바 응용 프로그램에 이미지를 보낼 무슨 일이 일어나고있는 것 true를 돌려주는 경우에도 '소켓이 닫혀'바탕 화면 서버 자바 응용 프로그램을 실행 중이고 클라이언트 안드로이드 응용 프로그램이 장치에서 실행되면 이미지가 서버로 전송되고 해당 부분이 잘 돌아갑니다. 그 후 서버 응용 프로그램은 콘솔에서 행을 가져 와서 다시 Android app으로 전달합니다. TILL 메시지가 안드로이드 앱에 의해 수신되면, 진행 대화 상자가 표시되고 거기에 갇히게됩니다. 안드로이드 애플 리케이션은 readLine()을 사용하여 데스크톱 애플 리케이션에 의해 전달 된 문자열을 읽어야하지만 안드로이드 애플 리케이션에서 소켓을 통해 inputstream을 열려고 할 때 그것은 예외를 제공합니다.
다음 안드로이드 클라이언트
수입 java.net.ServerSocket에 대한 데스크탑 서버, 먼저 코드들이다; import java.net.Socket; import java.io. *;
class ProjectServer
{
ServerSocket serSock;
Socket sock;
BufferedReader in;
PrintWriter out;
public static void main(String ar[])
{
try
{
ProjectServer cs=new ProjectServer();
cs.startServer();
}
catch(Exception e)
{
}
}
public void startServer()
{
try
{
serSock=new ServerSocket(8070);
System.out.println("Waiting for client...");
sock=serSock.accept();
System.out.println("Connections done");
//Accept File
System.out.println("Connected");
System.out.println(sock.isConnected()+"1");
//receive code
int filesize=450660;
int bytesRead;
int current=0;
// receive file
byte [] mybytearray = new byte [filesize];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream("C:\\Project Server\\Capture.png");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("end-start");
bos.close();
//sock.close();
//receive code ends
//System.out.println(br.readLine());
//Matlab computation
//Send result
System.out.println(sock.isConnected()+"2");
PrintWriter pr=new PrintWriter(sock.getOutputStream(),true);
pr.println((new BufferedReader(new InputStreamReader(System.in))).readLine());
System.out.println(sock.isConnected()+"3");
(new BufferedReader(new InputStreamReader(System.in))).readLine();
System.out.println(sock.isConnected()+"4");
}
catch(Exception e)
{
System.out.println(e);
e.printStackTrace();
}
}
}
안드로이드 클라이언트 : 여기 BTW
package com.site.custom;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class Act2 extends Activity
{
private ProgressDialog pd;
private String serverIP="58.146.100.187";
private BufferedReader in;
private PrintWriter out;
private String path;
private Socket cliSock;
public void onCreate(Bundle onCreateInstance)
{
super.onCreate(onCreateInstance);
setContentView(R.layout.act2);
this.setTitle("This has started");
path=getIntent().getStringExtra("path");
//Establish Connection
//pd=ProgressDialog.show(this, "Establishing connection", "Finding server",false,true);
try
{
cliSock=new Socket(serverIP,8070);
//pd.dismiss();
//Log.v("MERA MSG","changing text");
((TextView)findViewById(R.id.tview)).setText(path);
}
catch(Exception e)
{
Log.v("MERA MSG",e.toString());
}
//Send file
//Log.v("MERA MSG","changing text1");
ProgressDialog pd=ProgressDialog.show(this, "Sending image", "Image chosen:"+path.substring(path.lastIndexOf("//")+1),false,true);
//Log.v("MERA MSG","changing text2");
try
{
File myFile = new File (path);
System.out.println((int)myFile.length());
byte[] mybytearray = new byte[450560];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
OutputStream os = cliSock.getOutputStream();
System.out.println("Sending...");
os.write(mybytearray,0,mybytearray.length);
os.flush();
os.close();
bis.close();
//sock.close();
//System.out.println("Completed");
System.out.println(cliSock.isConnected()+"1");
pd.dismiss();
//System.out.println("Done");
System.out.println(cliSock.isConnected()+"2");
//Show dialog box till computation results arrive
pd=ProgressDialog.show(this, "Recognizing...", "(waiting for server reply)",false,true);
System.out.println(cliSock.isConnected()+"3");
in=new BufferedReader(new InputStreamReader(cliSock.getInputStream()));
System.out.println(in.readLine());
pd.dismiss();
}
catch(Exception e)
{
Log.v("MERA MSG",e.toString());
e.printStackTrace();
}
}
}
그리고는 로그 캣의 로그입니다 가 http://pastebin.com/atHMycTa 당신은 그것을 선 350 및 349 봐에 진정한 같이 소켓이 아직 여기에 연결되어 있는지 확인할 수 있습니다 오류 351 행.
이것이 원인 일지는 모르겠지만 소켓에서 데이터를 읽은 후'os.close()'호출을 이동하려고 할 수 있습니까? 출력 스트림을 닫으면 소켓도 닫히는 지 기억이 나지 않습니다. 아니면 입력 스트림을 닫을 때만 발생합니다. – Patrick
@patrick 아니요, 내 대답을보십시오. – EJP
@EJP : 아, 죄송합니다. 뭔가 다른 것과 혼동되어 있어야합니다. – Patrick