java & swift socket communication(tcp 소켓통신)

자바와 스위프트 간에 소켓통신하기

server = Java

client = swift

1. swift 3 socket communication code

아래의 사이트에서 참고했습니다.

1. cocoapod 설치

이미 cocoapod를 설치했다면 이 단계를 생략합니다.

gem install cocoapods

2. Podfile 생성

터미널에서 프로젝트 폴더로 간 후 아래 코드를 입력합니다.

참고로 프로젝트.xcodproj 파일이 있는 곳입니다.

pod init

그러면 Podfile이 생성됩니다.

3. Podfile 수정

Podfile을 엽니다.

open Podfile

#Pods for __프로젝트 이름__ 밑에 아래 코드를 추가한다.

pod ‘SwiftSocket’

저장한 후 닫습니다.

4. pod install

터미널에 아래 코드를 입력합니다.

pod install

options는 무시하세요…(잘못쳐서…)

이렇게 나오면 성공입니다.

저기 블록친 내용처럼 이제부터는 프로젝트이름.xcworkspace 를 사용해야합니다.

5. xcode에 코드 입력.

맨 위에 언급했던 것과 같은 곳입니다.

프로젝트를 생성하고 ViewController에 위의 사이트에 있는 코드를 입력합니다. (위의 링크는 아래에 적은 것과 같은 코드이지만 위의 링크를 참고하시는 걸 추천합니다. 아래에 적은 것은 띄어쓰기가 잘 안되어있어서..)

import UIKit
import SwiftSocket
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
let host = "127.0.0.1"
let port = 9999
var client: TCPClient?
override func viewDidLoad() {
super.viewDidLoad()
client = TCPClient(address: host, port: Int32(port))
}
@IBAction func sendButtonAction(_ sender: Any) {
guard let client = client else { return }
switch client.connect(timeout: 10) {
case .success:
appendToTextField(string: "Connected to host \(client.address)")
if let response = sendRequest(string: "GET / HTTP/1.0\n\n", using: client) {
appendToTextField(string: "Response: \(response)")
}
case .failure(let error):
appendToTextField(string: String(describing: error))
}
}
private func sendRequest(string: String, using client: TCPClient) -> String? {
appendToTextField(string: "Sending data ... ")
switch client.send(string: string) {
case .success:
return readResponse(from: client)
case .failure(let error):
appendToTextField(string: String(describing: error))
return nil
}
}
private func readResponse(from client: TCPClient) -> String? {
guard let response = client.read(1024*10) else { return nil }
return String(bytes: response, encoding: .utf8)
}
private func appendToTextField(string: String) {
print(string)
textView.text = textView.text.appending("\n\(string)")
}
}

5–1 같은 기기에서의 소켓통신

위의 코드처럼 이 주소를 사용합니다. 코드를 변경할 필요 없이 그대로 사용하시면 됩니다.

let host = "127.0.0.1"

5–2 다른 기기 간의 소켓통신

먼저 다른 기기와 소켓통신을 하기 위해서는 같은 네트워크에 연결되어있어야합니다.

Server역할을 하는 기기(제 기준 라즈베리파이)의 터미널에서 아래 코드를 입력합니다.

ifconfig

위 사진에서 블럭친 곳에 해당하는 주소를 5번 코드의 host 값에 입력합니다.

제 주소는 위와 같으므로 입력하면 아래와 같습니다.

let host = "192.168.0.4"

2. JAVA socket communication code

아래의 블로그를 참고하시면 됩니다.

저는 자바(라즈베리파이)에서 데이터를 스위프트로 넘겨주는 프로젝트를 했기 때문에 아래 블로그에서 Server 코드만을 이용했습니다.

3. 결과

먼저 Server(Java)를 Run 한 뒤 Client(Swift)를 빌드합니다.

그리고 시뮬레이터의 버튼을 누릅니다.

결과.

시뮬레이터에서 hello world를 받았습니다.