iPhone의 iOS 앱과 삼성 Galaxy S3의 Android 앱은 Wi-Fi 네트워크에서 서로 통신해야합니다.TCP iOS 앱과 Android 앱 간의 소켓 통신
iOS 앱에서는 CocoaAsyncSocket
라이브러리를, Android 앱에서는 java.net.Socket
라이브러리를 사용하고 있습니다.
는 == iOS 앱은 부품 ==
- (void)socket:(GCDAsyncSocket *)sender didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
[clientSocketList addObject:newSocket];
NSMutableDictionary *newClientInfo = [[NSMutableDictionary alloc] init];
[newClientInfo setObject:@"0" forKey:@"status"];
[clientInfoList addObject:newClientInfo];
[newSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
}
- (void) writeData:(NSData*)data to:(GCDAsyncSocket*)sock {
NSMutableData *dataWithLine = [data mutableCopy];
[dataWithLine appendData:[GCDAsyncSocket CRLFData]];
[sock writeData:dataWithLine withTimeout:-1 tag:0];
}
== 안드로이드 부품 == 위의 코드에서
public boolean connectServer() {
try {
socket = new Socket(SOMEIP, SOMEPORT);
binaryInput = socket.getInputStream();
this.input = new BufferedReader(new InputStreamReader(binaryInput));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
}
catch(Exception e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
while(status != STATUS_STOPPED) {
try {
String read = input.readLine();
//Doing stuff
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void sendMessage(String message) {
out.println(message);
}
는 iOS 앱은 서버이며, 안드로이드 응용 프로그램은 클라이언트입니다 . 나는 위의 코드에서 할 것을 예정하고있어 무엇
는
안드로이드 응용 프로그램은 메시지를 전송하고 iOS 앱은 그것을받습니다. 각 메시지는 개행 문자로 식별됩니다. 안드로이드 앱은
println
메서드로 메시지를 보내고 iOS 앱은 CRLF (새 라인) 문자를받을 때까지 메시지를받습니다.iOS 앱이 메시지를 보내고 Android 앱이 메시지를 수신합니다. 각 메시지는 개행 문자로 식별됩니다. iOS 응용 프로그램은 CRLF를 마지막에 첨부하여 메시지를 보내고 안드로이드 응용 프로그램은
readline
방법으로 메시지를받습니다. 안드로이드 응용 프로그램은 메시지를 보낼 때
문제이며, iOS 앱의 didReceiveData 대리자가 호출되지 않습니다. 한 가지는 iOS 앱 소켓이 스트리밍에서 CRLF 문자를 찾을 수 없다는 것입니다.
실제 데이터 다음에 CRLF 바이트 ([0x0d, 0x0a])를 첨부하여 Android 앱에서 메시지를 보내려고했으나 행운이 없었습니다.
고맙습니다 실제 용액 out.flush '이었다
는 CRLF 강제 대신PrintWriter.print()
를 사용한다. 그것을 해결! – adeltahir