자바 다 중 스 레 드 랜 채 팅 방 인 스 턴 스 생 성

6376 단어 Java채 팅 방
랜 채 팅 방
한 학기 동안 자 바 를 공부 한 후에 자 바 는 정말 넓 고 심오 하 다 고 생각 했 습 니 다.c++때문에 자 바 를 경시 하 는 마음 을 철저히 포기 하고 다 중 스 레 드 채 팅 방 을 만들어 서버 와 클 라 이언 트 기기 의 조작 을 익 혔 습 니 다.
1.TCP
랜 연결 을 실현 하려 면 정보 전송 의 원 리 를 알 아야 한다.
랜 에서 전 송 된 정 보 는 모두 패키지 형식 입 니 다.제 가 사용 하 는 TCP 패키지 로 데 이 터 를 전송 하고 TCP 패키지 에 IP 메 시 지 를 봉 했 습 니 다.
다음은 정적 IPV 4 프로 토 콜 클래스 를 통 해 서버 의 IP 주 소 를 얻 는 것 입 니 다.

address = InetAddress.getByName("192.168.43.86");
2.소켓
TCP 에서 서버 의 IP 주 소 를 받 았 으 나 IP 주소 만으로 구체 적 인 애플 리 케 이 션 을 잠 글 수 없어 소켓 이라는 개념 을 도입 했다.포트 번 호 는 호스트 의 프로 세 스 를 잠 그 는 데 사 용 됩 니 다.포트 번 호 는 보통 1024~49151 을 가 져 옵 니 다.0~1023 은 포트 번 호 를 잘 알 고 있 기 때문에 보통 HTTP 등 자주 사용 하 는 포트 에 사 용 됩 니 다.49152~65535 는 임시 포트 번호 이 고 무 작위 로 점용 할 수 없 으 며 프로그램 실행 과정 에서 임시 분 배 됩 니 다.
소켓=IP+포트 번호
이 말 은 포트 번호 9998 과 IP 를 192.168.43.86 으로 정의 하 는 소켓 이다.

int port = 9998;
socket = new Socket(address,port);
3.C/S 구조
在这里插入图片描述
자바 류 의 측면 에서 볼 때 서버 와 클 라 이언 트 는 소켓 연결 을 통 해 연결 을 추상 화 했다.서버 는 자신의 소켓 포트 를 만 들 고 고객 이 이 포트 에 연결 되 어 있 는 지 감청 함으로써 정보의 읽 기 기능 을 실현 합 니 다.클 라 이언 트 는 서버 가 약속 한 포트 번 호 를 통 해 서버 에 데 이 터 를 전송 합 니 다.서버 가 켜 지면 클 라 이언 트 를 실행 하고 서버 와 세 번 악 수 를 하여 TCP 연결 을 한 다음 에 이 연결 을 바탕 으로 클 라 이언 트 와 서버 의 통신 을 실현 한다.
4.다 중 스 레 드
서버 가 여러 대상 을 동시에 서비스 할 수 있 기 때문에 전통 적 인 방법 으로 서버 연결 을 하면 여러 개의 클 라 이언 트 가 한 클 라 이언 트 와 서버 의 상호작용 을 기다 리 는 현상 이 나타 날 수 있다.이 문 제 를 해결 하기 위해 서 다 중 스 레 드 방법 을 채택 하 다.
슈퍼 소켓 클래스 로 socket 클래스 를 계승 하여 Runnable 인 터 페 이 스 를 실현 하여 다 중 스 레 드 운행 을 실현 합 니 다.

class SuperSocket extends Socket implements Runnable

SuperSocket socket_1 = new SuperSocket(9999);
SuperSocket socket_2 = new SuperSocket(9998);
SuperSocket socket_3 = new SuperSocket(9997);
Thread s1 = new Thread(socket_1);
Thread s2 = new Thread(socket_2);
Thread s3 = new Thread(socket_3);
5.서버
서버 의 구조 세 번 째 부분 에서 보 듯 이 코드 는 다음 과 같다.

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TCPserver2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //                socket 
        //              
        SuperSocket socket_1 = new SuperSocket(9996);
        SuperSocket socket_2 = new SuperSocket(9998);
        SuperSocket socket_3 = new SuperSocket(9997);
        //       
        Thread s1 = new Thread(socket_1);
        Thread s2 = new Thread(socket_2);
        Thread s3 = new Thread(socket_3);
        try {
            while(true) {
            	//    
                s1.start();
                s2.start();
                s3.start();
                if(scan.next()=="123"){
                //    
                    break;
                }
            }
        } finally {
            try {
            //     
                socket_1.close();
                socket_2.close();
                socket_3.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class SuperSocket extends Socket implements Runnable{

    InputStream is;
    byte[] buffer;
    Socket socket=null;
    ServerSocket serverSocket=null;

    public SuperSocket(int port){
        try {
        //         
            serverSocket = new ServerSocket(port);
            buffer = new byte[1024];

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        try {
        	//      
            socket = serverSocket.accept();
            //          
            is = socket.getInputStream();
            //         
            int len = is.read(buffer);
            String str = new String(buffer, 0, len);
            System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
클 라 이언 트
클 라 이언 트 의 구조 세 번 째 부분 에서 보 듯 이 코드 는 다음 과 같다.

package TCP;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TCPclient {
    public static void main(String[] args) {
        InetAddress address=null;
        Socket socket=null;
        OutputStream os=null;
        String message=null;
        Scanner sca=null;
        try {
            //    IP  
            address = InetAddress.getByName("192.168.43.86");
            //     ,     
            int port = 9998;
            socket = new Socket(address,port);
            //         
            os = socket.getOutputStream();
            sca = new Scanner(System.in);
            while(true) {
                message = sca.next();
                //     ,       
                os.write(message.getBytes());
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
            //     ,  io 
                os.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
해결,매우 초라 하지만 랜 류 의 통신 도 실현 할 수 있 습 니 다.필요 하 다 면 서버 의 IP 주 소 를 바 꾸 세 요.IP 주 소 는 cmd 에서 ipconfig 명령 으로 볼 수 있 습 니 다.기말고사 가 끝나 면 GUI 를 더 해 알파 가지치기 알고리즘 을 가 진 AI 6 자 바둑 대결 에 추가 할 계획 이다.
자바 가 다 중 스 레 드 랜 채 팅 방 을 만 드 는 인 스 턴 스 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 가 다 중 스 레 드 채 팅 방 을 만 드 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기