Java 소켓: 클라이언트/서버 채팅 응용 프로그램 만들기

이 튜토리얼에서는 소켓을 사용하여 두 컴퓨터 간에 Java 채팅 애플리케이션을 만드는 방법을 배웁니다. 프로그래밍 부분을 시작하기 전에 예를 들어 이 두 기계가 가정의 로컬 네트워크에서 상호 작용하도록 네트워크를 구성해야 합니다.amp르. 우리는 이론적으로 잘 알려진 클라이언트/서버 모델을 구현할 것입니다.

이 튜토리얼을 마치면 소켓이 메시지를 교환하는 방법을 알게 될 것입니다.

Server

javaserver>는 연결을 초기화하고, 포트에서 수신 대기하고, 수신 연결이 승인될 때까지 기다립니다. 예를 들어, 포트 번호가 5000인 경우 클라이언트는 이 포트 번호가 5000인 서버에 요청을 보냅니다. 서버는 요청을 수락하고 해당 정보(IP 주소)를 클라이언트로 전송합니다. 이제 연결이 설정되고 메시지 교환이 가능합니다.

Java는 모든 네트워킹을 처리하는 패키지 java.net를 제공하며 두 개의 클래스 만 필요합니다 :

  • java.net.ServerSocket: 이 클래스는 clients.
  • java.net.Socket: 이 클래스는 원격 시스템에 연결합니다.
스트림을 입력하고, 보내고받는 도구도 필요합니다.
  • 스캔: 키보드 입력 읽기.
  • BufferedReader: 보낸 사람으로부터 받은 텍스트를 읽습니다.
  • PrintWriter: 입력된 텍스트를 보냅니다.
ServerSocket socketserver; 
서버의 소켓 소켓;
final BufferedReader 에서;
final PrintWriter 출력;
final 스캐너 sc=새로운 스캐너(System.in);
try {
socketserver = new ServerSocket(5000);
serversocket = socketserver.accept();
out = new PrintWriter(serversocket.getOutputStream());
in = 새로운 BufferedReader (새로운 InputStreamReader (serversocket.getInputStream()));
문자열 s;
s = sc.next();
out.println(들);
out.flush()를 호출합니다.
문자열 message_client;
message_client = in.readLine();
System.out.println("클라이언트: "+message_client);
}
catch (IOException e) {
e.printStackTrace();
}
포트 번호가 5000인 서버 소켓이 생성된 후 서버는 들어오는 연결을 기다렸다가 연결이 감지되는 즉시 수락합니다. 읽기 및 쓰기 흐름을 처리하는 두 변수 inout은 송신 및 수신 스트림에 직접 연결되도록 초기화됩니다.
변수 s  next() 한 다음 println(s).
flush()은 쓰기 버퍼를 출력으로 플러시하기 때문에 중요하며, 그렇지 않으면 null은 다른 컴퓨터에서 수신됩니다.
변수 message_client 메시지를 저장합니다.   println().

이 코드의 한계는 메시지를 한 번만 보내고 받을 수 있다는 것입니다. 당신은 염두에두고있을 것입니다 : 루프를 추가하십시오 while(true)입니다. 이는 사실이지만 예를 들어 서버가 클라이언트에 메시지를 보내는 경우 클라이언트도 메시지를 보낼 때까지 메시지를 검색할 수 없습니다. 최적의 솔루션은 두 개의 스레드, 즉 하나는 전송용이고 다른 하나는 수신용입니다. 이 두 프로세스 모두 전송과 수신이 동시에 발생할 수 있습니다.

import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader입니다.
import java.io.PrintWriter를 사용합니다.
import java.net.ServerSocket;
import java.net.Socket;
import java.util.스캐너;
/*
* www.codeurjava.com
*/
public class 서버 {

public static void main(String[] test) {

final ServerSocket serverSocket;
최종 소켓 clientSocket;
최종 BufferedReader;
최종 PrintWriter 출력;
스캐너 sc=new 스캐너(System.in);

{
serverSocket = new ServerSocket(5000);
clientSocket = serverSocket.accept();
out = new PrintWriter(clientSocket.getOutputStream());
in = 새로운 BufferedReader (새로운 InputStreamReader (clientSocket.getInputStream()));
스레드 send= new Thread(new Runnable() {
문자열 메시지;
@Override
public void run() {
while(true){
msg = sc.nextLine();
out.println(msg);
out.flush()를 호출합니다.
}
}
});
send.start();

스레드 수신= new Thread(new Runnable() {
문자열 메시지;
@Override
public void run() {
try {
msg = in.readLine();
//클라이언트가 연결되어 있는 동안
while(msg!=null){
System.out.println("Client: "+msg);
메시지 = in.readLine();
}
//클라이언트가 deconected
System.out.println("Client deconected");
//스트림과 세션 소켓 닫기
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receive.start();
}catch (IOException e) {
e.printStackTrace();
}
}
}

두 프로세스의 구분이 명확하며 서버와 클라이언트는 언제든지 무한히 데이터를 교환할 수 있습니다. 재생의 while 루프는 연결이 여전히 설정되어 있는지 여부를 테스트합니다. 읽기 및 쓰기 스트림과 close()입니다.

Client

클라이언트에는 Socket server 연결를 설정합니다. constructor는 서버의 IP 주소와 포트 번호를 입력으로 사용합니다. 나머지 코드는 server.

import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader입니다.
import java.io.PrintWriter를 사용합니다.
import java.net.Socket;
import java.util.스캐너;
/*
* www.codeurjava.com
*/
public class Client {

public static void main(String[] args) {

final Socket clientSocket;
최종 BufferedReader;
최종 PrintWriter 출력;
final Scanner sc = new Scanner(System.in);//키보드에서 읽습니다

try {
/*
* 서버 정보(포트 및 IP 주소 또는 호스트 이름
* 127.0.0.1은 컴퓨터의 로컬 주소입니다
*/
clientSocket = new Socket("127.0.0.1", 5000);

//보낼 스트림
out = new PrintWriter(clientSocket.getOutputStream());
//수신할 스트림
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

스레드 보내기 = new Thread(new Runnable() {
문자열 메시지;
@Override
public void run() {
while(true){
msg = sc.nextLine();
out.println(msg);
out.flush()를 호출합니다.
}
}
});
send.start();

수신 스레드 = new Thread(new Runnable() {
문자열 메시지;
@Override
public void run() {
try {
msg = in.readLine();
while(msg!=null){
System.out.println("서버: "+msg);
메시지 = in.readLine();
}
System.out.println("연결 해제된 서버");
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receive.start();

} catch (IOException e) {
e.printStackTrace();
}
}
}
실행:

Java tcp 소켓 서버< / a>< / td >< / tr>
서버 창 < / span >< / td >< / tr>< / tbody >< / table >
클라이언트 소켓 tcp java
클라이언트 창
참고: 동일한 시스템에서 작업 중인 경우 Eclipse를 두 번 실행해야 합니다(하나는 서버용, 다른 하나는 클라이언트용). 다음 YouTube 비디오를보십시오 :
https://www.youtube.com/watch?v=d-eD6EDa3io