클라이언트에서 온 데이터를 수신하는 스레드이다.
마찬가지로 별도의 Thread를 만들기위해 Thread클래스를 상속받아 run()메서드를 구현한다.
socket.getIntputStream()을 사용해서 클라이언트에게 데이터를 수신할 수 있다.
package 소켓서버;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
public class ReceiveThread extends Thread {
private final Socket socket;
public ReceiveThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataInputStream tmpbuf = new DataInputStream(socket.getInputStream());
String receiveString;
while (true) {
receiveString = tmpbuf.readUTF();
System.out.println("상대방 : " + receiveString);
}
} catch (SocketException e1) {
System.out.println("상대방 연결이 종료되었습니다.");
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
서버에서 클라이언트로 데이터를 전송하는 스레드이다.
별도의 Thread를 만들기위해 Thread클래스를 상속받아 run()메서드를 구현한다.
socket.getOutputStream()을 사용해서 클라이언트에게 데이터를 전송할 수 있다.
package 소켓서버;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class SendThread extends Thread {
private final Socket socket;
private Scanner scanner = new Scanner(System.in);
public SendThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataOutputStream sendWriter = new DataOutputStream(socket.getOutputStream());
String sendString;
while(true){
sendString = scanner.nextLine();
sendWriter.writeUTF(sendString);
sendWriter.flush();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
클라이언트의 연결 요청을 기다리면서 연결 수락을 담당하는 클래스
package 소켓서버;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws IOException {
int port = 8888;
ServerSocket socketServer = new ServerSocket(port);
while(true) {
Socket sock = socketServer.accept();
System.out.println("ip : " + sock.getInetAddress() + " 와 연결되었습니다.");
ReceiveThread receiveThread = new ReceiveThread(sock);
receiveThread.start();
SendThread sendThead = new SendThread(sock);
sendThead.start();
}
}
}