서버소켓을 만들고, 클라이언트가 접속하면 만들어진 소켓을 사용하여 클라이언트와 데이터를 주고받는다.
TcpChatServer
1. ServerSocket,Socket 객체 생성 & accept() 클라이언트 접속 대기
- 서버에서는 port를 지정해서 소켓과 바인딩 시킴
이후 클라이언트의 요청을 기다리고 요청이 들어오면 데이터 송수신 스레드 만들어서 통신
ServerSocket 변수명 = null;
Socket 변수명 = null;
try {
ServerSocket_변수명 = new ServerSocket(포트번호);
Socket_변수명 = ServerSocket_변수명.accept();
} catch (IOException e) {
e.printStackTrace();
}
2. Sender클래스 객체 생성
Sender 변수명 = new Sender(Socket_변수명);
Sender_변수명.start();
- 예시
더보기
Sender sender = new Sender(socket);
sender.start();
3. Receiver클래스 객체 생성
Receiver 변수명 = new Receiver(Socket_변수명);
Receiver_변수명.start();
- 예시
더보기
Receiver recv = new Receiver(socket);
recv.start();
Sender extends Thread : 데이터 전송
1. 필드 선언
- Socket_변수명. getOutputStream() 사용해서 클라이언트에게 데이터 전송
private Scanner 변수명;
private DataOutputStream 변수명;
- 예시
더보기
private Scanner scan;
private String name;
private DataOutputStream dos;
2. 생성자 생성
public Sender(Socket socket) {
Scanner_변수명 = new Scanner(System.in);
//이름으로 사용
String_변수명 = "[" + Socket_변수명.getLocalAddress() + " : " + Socket_변수명.getLocalPort() + "]";
try {
DataOutputStream_변수명 = new DataOutputStream(Socket_변수명.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
- 예시
더보기
public Sender(Socket socket) {
scan = new Scanner(System.in);
name = "[" + socket.getLocalAddress() + " : " + socket.getLocalPort() + "]";
try {
dos = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
3. 스레드 생성
@Override
public void run() {
while (DataOutputStream_변수명 != null) { //무한 루프
try {
//메세지 보냄
DataOutputStream_변수명.writeUTF(String_변수명 + ">>>"+ Scanner_변수명.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 예시
더보기
@Override
public void run() {
while (dos != null) { //무한 루프
try {
//메세지 보냄
dos.writeUTF(name + ">>>"+ scan.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Receiver extends Thread : 수신
1. 필드선언
- Socket_변수명.getInputStream()을 사용해서 클라이언트에게 데이터 수신
private DataInputStream 변수명;
- 예시
더보기
private DataInputStream dis;
2. 생성자 생성
public Receiver(Socket socket) {
try {
DataInputStream_변수명 = new DataInputStream(Socket_변수명.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
- 예시
더보기
public Receiver(Socket socket) {
try {
dis = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
3. 스레드 생성
@Override
public void run() {
while (DataInputStream_변수명 != null) { //무한루프
try {
//상대방이 문자로 보낼때까지 기다림
System.out.println(DataInputStream_변수명.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 예시
더보기
@Override
public void run() {
while (dis != null) { //무한루프
try {
//상대방이 문자로 보낼때까지 기다림
System.out.println(dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
TcpCharClient
- 서버의 IP주소와 port를 사용해 connection 맺는다
이후 데이터 송수신 스레드 실행
1. Socket 객체 생성 & 접속
Socket 변수명 = new Socket("IP주소",포트번호);
- 예시
더보기
Socket socket = new Socket("192.168.144.~",7777);
2. Sender클래스 객체 생성
Sender 변수명 = new Sender(Socket_변수명);
Sender_변수명.start();
- 예시
더보기
Sender sender = new Sender(socket);
sender.start();
3. Receiver클래스 객체 생성
Receiver 변수명 = new Receiver(Socket_변수명);
Receiver_변수명.start();
- 예시
더보기
Receiver recv = new Receiver(socket);
recv.start();
원본
TcpChatServer
더보기
package kr.or.ddit.tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpChatServer {
public static void main(String[] args) {
/*
* 서버소켓을 만들고, 클라이언트가 접속하면 만들어진 소켓을 사용하여 클라이언트와 데이터를 주고받는다.
*/
ServerSocket server = null;
Socket socket = null;
try {
server = new ServerSocket(7777);
System.out.println("채팅서버 대기중");
socket = server.accept();
System.out.println("클라이언트와 연결되었습니다.");
Sender sender = new Sender(socket);
sender.start();
Receiver recv = new Receiver(socket);
recv.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TcpCharClient
더보기
package kr.or.ddit.tcp;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpCharClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.144.25",7777);
System.out.println("챗서버에 연결되었습니다.");
Sender sender = new Sender(socket);
sender.start();
Receiver recv = new Receiver(socket);
recv.start();
}
}
Sender
더보기
package kr.or.ddit.tcp;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class Sender extends Thread {
private Scanner scan;
private String name;
private DataOutputStream dos;
public Sender(Socket socket) {
scan = new Scanner(System.in);
name = "[" + socket.getLocalAddress() + " : " + socket.getLocalPort() + "]";
try {
dos = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (dos != null) { //무한 루프
try {
//메세지 보냄
dos.writeUTF(name + ">>>"+ scan.nextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Receiver
더보기
package kr.or.ddit.tcp;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class Receiver extends Thread {
private DataInputStream dis;
public Receiver(Socket socket) {
try {
dis = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (dis != null) { //무한루프
try {
//상대방이 문자로 보낼때까지 기다림
System.out.println(dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}