안드로이드(클라이언트) <-> 라즈베리파이(서버) 간 통신을 구현하고 있습니다.
서버는 파이썬을 사용중이구요
클라이언트에서 서버로 메시지 전달은 잘 되는데 역으로 보낼때마다 에러가 발생합니다.
클라이언트 측
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setRunningState(true);
(new Connect()).start();
}
});
}
class Connect extends Thread {
public void run() {
Log.d("Connect", "Run Connect");
String ip = null;
int port = 0;
try {
ip = "175.116.88.177";
port = 1999;
sock = new Socket(ip, port);
outstream = new DataOutputStream(sock.getOutputStream()); //출력 Stream
instream = new DataInputStream(sock.getInputStream()); //입력 Stream
mHandler.post(new Runnable() {// Thread에서 UI 변경시 Handler 이용
@Override
public void run() {
// TODO Auto-generated method stub
setToast("연결에 성공하였습니다.");
}
});
System.out.println("Connected!!");
(new recvSocket()).start(); // 소켓 연결 후 데이터를 받는 쓰레드를 실행하여 데이터 받을 준비
} catch (Exception e) {
final String recvInput = "연결에 실패하였습니다.";
Log.d("Connect", e.getMessage());
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setToast(recvInput);
}
});
}
}
}
class recvSocket extends Thread {
public void run() {
try {
instream = new DataInputStream(sock.getInputStream());
while (true) {
byte[] b = new byte[100];
int ac = instream.read(b, 0, b.length);
String input = new String(b, 0, b.length);
final String recvInput = input.trim();
if(ac==-1) //파이썬 측에서 Broken Pipe Error 발생으로 메시지가 전달되지 않아 ac 값이 -1이 나오는 것 같다
break;
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setToast(recvInput);
}
});
}
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setToast("연결이 종료되었습니다.");
}
});
} catch (Exception e) {
final String recvInput = "연결에 문제가 발생하여 종료되었습니다..";
Log.d("SetServer", e.getMessage());
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
setToast(recvInput);
}
});
}
}
}
서버 측
s = socket(AF_INET, SOCK_STREAM)
s.bind(ADDR)
s.listen(1)
client, conn = s.accept()
print "Connected From", conn
def connection():
#b.sendto(conn[0],conn)
#RTS()
while True:
data = client.recv(1024)
#print len(data)
if len(data) > 0:
print 'recieved msg : ', data
s.send(data)
value = int(data)
slave.set_values(block, 30, value)
value = str(slave.get_values(block,30,1))
s.close()
client.close()
서버측은 위 함수가 쓰레드로 돌고 있습니다.
에러 내용
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/pi/modbus_tk_main.py", line 40, in connection
s.send(data)
error: [Errno 32] Broken pipe
추가> Broken pipe 익셉션은 소켓 연결이 유지가 되지 않아 생기는 것이라고 본것 같은데
클라이언트 측에서 보내기만 할땐 잘 되는데
데이터를 받아서 그 내용 그대로 돌려주기를 해도 되질 않으니 갑갑해 죽겠습니다.
고수님들 도와주세요.ㅠㅠ