안녕하세요 제가 서버와 http통신을 하는데 자꾸 예외가 발생합니다. 10번하면 2~3번은 발생하는 에러라
조금 난감한데요. 제가 궁금한것이
1. http 연결을 할때 서버로부터 데이터를 받아들이지 못하는 경우 nullpointer exception
2. 서버로부터 데이터를 받으나 데이터가 짤리는 경우
3. socket exception 발생
4. 시간초과로 인한 connect Time 예외 발생
이렇게 예외처리가 발생하는데 httpcilent 가 원래 이렇게 요청하면 데이터 정확성이 낮은지 궁금합니다.!
안드로이드 소스
class LoadMachineSpec extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... param) {
try {
HttpParams httpParameters = new BasicHttpParams();
HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
HttpClient client = new DefaultHttpClient(httpParameters);
HttpConnectionParams.setConnectionTimeout(httpParameters, 2000);
HttpConnectionParams.setSoTimeout(httpParameters, 2000);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);
// 주소
String postURL = "url;
HttpPost post = new HttpPost(postURL);
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("hhhh", PhoneNum.toString()));
UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);
post.setEntity(ent);
HttpResponse responsePOST = client.execute(post);
HttpEntity resEntity = responsePOST.getEntity();
if (resEntity != null) {
LoadData = EntityUtils.toString(resEntity, HTTP.UTF_8);
}
} catch (IOException e) {
pDialog.dismiss();
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
ViewPager viewPager;
if(LoadData==null)
{
pDialog.dismiss();
Toast.makeText(GroupChecklist.this, "재접속중..", Toast.LENGTH_SHORT).show();
LoadMachineSpec a =new LoadMachineSpec();
a.execute();
}
else{
pDialog.dismiss();
jsonParse();
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setOffscreenPageLimit(2);
viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager(),name_Str,location_Str,state,PhoneNum,viewPager,year,month,breakcount));
// Give the PagerSlidingTabStrip the ViewPager
PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
// Attach the view pager to the tab strip
tabsStrip.setViewPager(viewPager);
}
}
}
소스코드 (서버) WAS를 이용하며 doPost로 db연결, 값을 전해주는 역할입니다.
public class DayMachineState extends HttpServlet {
// 기계이름 , 위치 , 상태 값을 받아와 한번에 보내려함.
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String PhoneNum = request.getParameter("hhhh");
System.out.println("폰번호 : " + PhoneNum);
String jsonData;
JSONObject jObject = new JSONObject();
JSONArray jArray = new JSONArray();
DayMachineStateVO vo = new DayMachineStateVO();
PrintWriter out = response.getWriter();
getMyName(PhoneNum, vo);
// 나의 폰번호로 내가 담당하는 기계 이름 서치
getMyMachine(vo);
// 등록된 기계 정보를 받아옴
getMachineRegisted(vo);
// 기계 현재 상태정보를 받아옴
getMachineState(vo);
// 받아온 정보를 대조하여 상태값 추출
setMachineState(vo);
// 등록된 기기의 정보를 클라이언트에게 보냄
sendMachineSpec(vo, jArray);
jObject.put("day", jArray);
JSONArray jArrayYear = new JSONArray();
YearBrokeStateVO VO = new YearBrokeStateVO();
getYearMahcineBreakCount(VO, jArrayYear);
getYearWorkingBreakCount(VO, jArrayYear);
jObject.put("year", jArrayYear);
jsonData = jObject.toString();
System.out.println(jsonData);
out.print(jsonData);
}