java Application(Eclipse)
을 이용해 Server-Client TCP/IP Socket 통신하기
Server
ServerSocket을 생성한 후 Client에서 접속할 때까지 기다린다.
ServerSocket을 생성할 때는 port 번호를 지정해줘야 하는데 이때 이미 사용 중인 port 번호를 사용하면 안 된다.
// ServerSocket 생성
ServerSocket serverSocket = new ServerSocket(PORT_NUMBER);
// Client에서 접속할 때까지 기다리며, 접속하면 클라이언트와 연결된 Socket을 return한다.
Socket socket = serverSocket.accept();
Client
서버의 IP, Port번호를 통해 socket을 생성해 server와 통신할 수 있다.
Socket socket = new Socket(IP_ADDRESS, PORT_NUMBER);
// socket이 제대로 생성되었는지, server와 연결되었는지 확인한다
if (socket != null && socket.isConnected()) { }
Server - Client 통신
Stream을 통해 data를 주고받는다. Socket이 생성되면 outputstream과 inputstream을 통해 데이터를 주고받으면 된다.
InputStream in = socket.getInputStream();
InputStreamReader inr = new InputStreamReader(in);
// 빠른속도를 위해 BufferedReader를 사용한다
BufferedReader br = new BufferedReader(inr);
String str = br.readLine();
OutputStream out = socket.getOutputStream();
OutputStreamWriter outw = new OutputStreamWriter(out);
outw.write("안녕");
위의 code는 Thread를 사용하지 않은 가장 기본적인 server-client 통신 방법이다.
server
client가 접속할 때까지 대기하며, client가 접속하면 output stream 으로 "안녕"을 보낸다. while문을 통해 client가 계속 접속할 수 있도록 한다.
client
server의 IP 주소와 port번호를 통해 접속하고, input stream으로 server에서 보낸 data를 읽는다.
Thread를 이용해 다중접속을 가능하게 하고, 실시간으로 데이터를 Receive하는 기능, 1:1 채팅 기능 등은 다른 package에 구현했다. 다음 link로 접속하면 확인할 수 있다.
more
#예외
java.net.BindException: Address already in use: NET_Bind
Port 번호가 중복될 때 발생하는 예외이다. 8080의 경우 oracle에서 사용중인 포트번호이기 때문에 소켓을 생성할 수 없다.
public class Server {
int port;
ServerSocket serverSocket;
Socket socket;
public Server() throws IOException {
port = 8080;
serverSocket = new ServerSocket(port);
}
public void startServer() throws IOException {
try {
socket = serverSocket.accept();
} catch (IOException e) {
throw e;
}
}
public static void main(String[] args) {
Server server = null;
try {
server = new Server();
server.startServer();
} catch(IOException e) {
e.printStackTrace();
}
}
}