H/W 가 클라이언트
안드로이드 폰이 서버입니다.
H/W에서 폰에 소켓통신으로 접속해서 특정 문자열을 지속적으로 보내줍니다.
H/W가 보낸 문자열중에 특정 문자열이 파악되면 폰에서 카운트가 쌓입니다.
현재 문자열을 받아서 처리하는곳 까지는 문제가 없는데요.
H/W가 재접속. 즉 연결을 끊었다가 다시 접속하면 서버에서 그 문자열을 정상적으로 받아오지 못합니다.
H/W로그상에서는 문자열이 계속 가는데도 불구하고 받아오지 못합니다.
서버쪽 코드입니다.
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import android.graphics.Path.FillType;
public class SoketServer extends Thread {
private static int PORT = 5555;
private Socket socket;
private ServerSocket ss;
private DataInputStream is;
private String writeMsg, readMsg = "";
ByteArrayOutputStream byteArrayOutputStream;
byte[] buffer = new byte[1024];
int bytesRead;
@Override
public void run() {
try {
ss = new ServerSocket(PORT);
// ss.setSoTimeout(5000);
} catch (IOException e) {
e.printStackTrace();
// 서버소켓 생성 실패
}
// 리슨
try {
socket = ss.accept();
is = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
// 접속과정에서 문제가 생김
}
while (true) {
try {
byteArrayOutputStream = new ByteArrayOutputStream(1024);
bytesRead = is.read(buffer);
if (bytesRead != -1) {
byteArrayOutputStream.write(buffer, 0, bytesRead);
readMsg = byteArrayOutputStream.toString("UTF-8");
// byteArrayOutputStream.close();
}
// readMsg = is.readUTF();
// is.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void soketclose(){
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String returnmsg(){
return readMsg;
}
public void setreadmsg(){
readMsg = "0";
}
}
서버를 실행시키는 코드입니다.
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
// private DataOutputStream os;
// private Handler hd;
private TextView message;
private EditText et;
private Button send, start;
private SoketServer Server;
private int countt = 1;
private Handler hd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
message = (TextView) findViewById(R.id.textview);
et = (EditText) findViewById(R.id.set1);
send = (Button) findViewById(R.id.sbt1);
start = (Button) findViewById(R.id.start1);
hd = new Handler();
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
start.setText("서버 가동");
Server = new SoketServer();
Server.start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (Server.returnmsg().equals("1")) {
runOnUiThread(new Runnable() {
@Override
public void run() {
message.setText(Integer.toString(countt));
countt++;
}
});
}
try {
Server.setreadmsg();
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
});
// hd.post(new Runnable() {
// @Override
// public void run() {
// while (true) {
// if (countt > 1) {
// message.setText("true");
// }
// }
// }
// });
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onStop() {
super.onStop();
if (Server != null) {
Server.soketclose();
}
}
}