Android로 Socket 통신
실장 요점
1. UI 스레드에서 네트워크 요청을 실행하지 마십시오.
아무 생각 없이 콘센트를 만들려고 하면 N e t work On MainThereadException이 발생합니다.
UI 스레드가 네트워크 통신을 허용하지 않기 때문입니다.(Android 3.0 이후)
이번에는 AsyncTask에서 요청 수용을 고려하여 구현했습니다.
public void connect(){
//第一引数:execute()で入れるパラメータ
//第二引数:onProgressUpdate()にいれるパラメータ
//第三引数:onPostExecute()に入れるパラメータ
new AsyncTask<Void,Void,String>(){
@Override
protected String doInBackground(Void... voids) {
Socket connection = null;
BufferedReader reader = null;
BufferedWriter writer = null;
String message = "result:";
String url = "http://" + mHost +":" + mPort + mPath;
try {
//ソケット
connection = new Socket(mHost, mPort);
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
// ~~ 中略 ~~
return message;
}
//doInBackGroundの結果(message)を受け取る
@Override
protected void onPostExecute(String result){
mTextView.setText(result);
}
}.execute();
}
DoInBackground () 를 통해 통신 처리를 하고, 반환 값은 onPostExecute () 이다.onPostExecute를 사용하여 UI 스레드로 값을 반환합니다.
2. 사용자 에이전트 지정
아무 생각 없이 요청하면 이동통신에서 온 것으로 판정되지 않는다.상황에 따라 부정확한 답변이 있을 수 있다.
따라서 요청 머리글에 User-Agent 정보를 추가합니다.예를 들어 서버의 안드로이드 4 와 같습니다.0으로 인식되려면
private String mUserAgent = "Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; SC-06D Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";
//BufferdWriterで設定
writer.write("User-Agent: " + mUserAgent);
User-Agent 정보는 여기를 참조하십시오. ->http://www.openspc2.org/userAgent/ 소스 코드
상술한 내용을 설치한 응용 프로그램은 여기에 있다.안드로이드 스튜디오로 제작된 것이기 때문에 프로젝트 import을 실행한 후 실행하면 시작할 수 있습니다.
https://github.com/tomoima525/SimpleSocketApplication
참고 자료
http://ash.jp/java/java_http.htm
http://x68000.q-e-d.net/~68user/net/java-http-socket-1.html
Reference
이 문제에 관하여(Android로 Socket 통신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomoima525/items/daa30505ad18e89641f9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)