클라이언트용 TCP 소켓 프로그래밍 순서
- 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라리언트용 소켓 객체 생성
- 서버와의 입출력 스트림 오픈
- 보조 스트림을 통해 성능 개선
- 스트림을 통해 읽고 쓰기
- 통신 종료
ReceiveThread
package 단일채팅클라이언트;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class RcvThread extends Thread {
private final Socket socket;
private String rcvString;
public RcvThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataInputStream buf = new DataInputStream(socket.getInputStream());
while (true) {
rcvString = buf.readUTF();
if(rcvString == null) {
System.out.println("상대방 연결이 종료 되었습니다.");
} else {
System.out.println("상대방 : " + rcvString);
}
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
SendThread
package 단일채팅클라이언트;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class SndThread extends Thread {
private final Socket socket;
Scanner sc = new Scanner(System.in);
public SndThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataOutputStream sndWriter = new DataOutputStream(socket.getOutputStream());
String sndString;
while (true) {
sndString = sc.nextLine();
sndWriter.writeUTF(sndString);
sndWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
SocketClient
package 단일채팅클라이언트;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;
public class SingleChatClient {
public static void main(String[] args) {
Socket sock = null;
try {
sock = new Socket("localhost", 8888);
System.out.println("서버와 연결되었습니다.");
} catch(ConnectException e) {
System.out.println("서버와의 연결이 거절었습니다. 서버를 먼저 실행 하세요.");
} catch (UnknownHostException e) {
System.out.println("서버를 알 수 없습니다.");
} catch (IOException e) {
throw new RuntimeException(e);
}
if(sock != null) {
RcvThread rcvThread = new RcvThread(sock);
rcvThread.start();
SndThread sndThread = new SndThread(sock);
sndThread.start();
}
}
}