자바 UDP 프로그래밍

TCP / IP, UDP는 전송 계층을 기반으로하고, UDP 전송 데이터 손실 상황에 관계없이 상대방의 발생 멀리 얻을 수있는 과거에 전송 수신되지 않는 데이터 수신을 보낸다;

UDP 기능 : 패킷으로 캡슐화 된 소스 및 대상 데이터는 연결을 설정하지 않는다 (DatagramPacket의의)

각 데이터의 크기는 64K 한도 내에서보고

아무 관련이 없었기 때문에, 신뢰할 수없는 프로토콜

연결 속도를 설정하지 않고;

우리는 다음과 같은 코드 생성 쇼를 작성합니다 UDP

A, 클라이언트 측

  

공용  클래스 UDPSocketClient { 
    
    공공  정적  무효 메인 (문자열 [] 인수)이 발생 하는 Throwable { 
    
            // 보내기 (); 
        
            keySend (); 
    
    } 

    개인  정적  무효 keySend는 () 가 발생 하는 Throwable { 
         
        시도 { 
            
            // 1,创建UDP服务 
            DatagramSocket로 소켓 = ) DatagramSocket로를 (; 
            
            BufferedReader의 리더 = 새로운 BufferedReader로 ( 새로운 InputStreamReader (System.in))를; 
            
             문자열 메시지 = 널 (null) ; 
            
            동안((메시지 reader.readLine = ())! = null의 ) { 
                
                
                IF (message.equals ( "886" ))   
                 
                    BREAK ; 
                
                // 2 캡슐화 패킷                     
                DatagramPacket의의 송신 = 새로운 새 DatagramPacket의의 (message.getBytes () message.getBytes () .length, InetAddress.getByName ( "로컬 호스트"), 8088 );
                 //는 3 차단 송신 데이터
                 (송신)을 socket.send; 
            } 
            . // 4 자원의 릴리스 
            Socket.close (); 
            
        } 캐치 (E SocketException이 ) {
             // 해야할 일 자동 생성 된 블록 캐치 
            e.printStackTrace (); 
        }
        
    }

두 서버에 끝

공용  클래스 UDPSocketServer { 
    
    공공  정적  무효 메인 (문자열 [] 인수)이 발생 Throwable의 {
         // 상기은 (수신) 
        ] Keyreceive을 () 
    } 

    개인  정적  공극 Keyreceive ()가 발생 Throwable의를 { 
         
        // 1 소켓 UDP 지정된 포트를 생성한다. 
        DatagramSocket에 소켓 =을 새로운 새 DatagramSocket로 (8088 ), 
        
        그동안 ( true로 ) {
              // 2 데이터 패킷을 수신하여 정의 될 
             바이트 [] 바이트 = 새로운 새  바이트 [1,024 ];
             DatagramPacket의 패킷 = 새로운 DatagramPacket의 (바이트 bytes.length); 
             socket.receive (패킷); // 阻塞式 
             문자열 메시지 = 새로운 문자열 (packet.getData (), 0 , packet.getData ()의 길이.); 
             에서 System.out.println ( "서버收到的消息为:"+ 메시지); 
        } 
        
         
    } 
}

셋째, 시험 결과;

먼저 서버 측을 시작하고 클라이언트를 엽니 다

클라이언트는 메시지를 전송

 

서버는 메시지를 수신

 

 멀티 스레드 채팅

첫째, 클라이언트

공공  클래스 UDPSocketClientThread는 구현 의 Runnable { 
    
    개인 DatagramSocket로 DatagramSocket로를;
    공개 UDPSocketClientThread (DatagramSocket로는 DatagramSocket) {
          .datagramSocket = DatagramSocket로; 
    } 

    @Override 
    공개  무효 실행 () { 
        
        BufferedReader의 리더 = 새로운 BufferedReader로 ( 새로운 InputStreamReader (System.in)); 
        
         문자열 메시지 = 널 (null) ; 
        
        시도 {
             동안 ((메시지 = reader.readLine ())! = null이 ) { 
                
                경우(message.equals ( "886" ))   
                 
                    체류 ; 
                
                // 2,发送数据 
                DatagramPacket의 센드 = 새로운 DatagramPacket의 (message.getBytes (), message.getBytes () 길이, InetAddress.getByName ( "192.168.43.255"), 8088. );
                // 阻塞式
                .datagramSocket.send (전송); 
            } 
        } 캐치 (UnknownHostException의 전자) { 
            
            e.printStackTrace (); 
        } 캐치 (IOException이 전자) { 
            
            e.printStackTrace (); 
        } 
    } 
    
}

둘째, 서버

공공  클래스 UDPSocketServerThread 구현 의 Runnable { 
    
    DatagramSocket로 소켓; 
    
    공공 UDPSocketServerThread (DatagramSocket로 소켓) {
          .socket = 소켓; 
    } 
 

    @Override 
    공개  무효 실행 () { 
        
        동안 ( ) {
              // 2定义数据要接收的报文
             바이트 [] 바이트 = 새로운  바이트 [1024 ]; 
             DatagramPacket의 패킷 = 새로운 DatagramPacket의 (바이트 bytes.length);
             시도 {
                socket.receive (패킷); 
            } 캐치 (IOException이 전자) {
                 // TODO 자동 생성 된 catch 블록의 
                e.printStackTrace (); 
            } // 阻塞式 
             문자열 메시지 = 새로운 문자열 (packet.getData (), 0 , packet.getData ()의 길이.); 
             의 InetAddress의 InetAddress = 널을 ;
            시도 { 
                의 InetAddress = InetAddress.getLocalHost (); 
                 에서 System.out.println (inetAddress.getHostAddress () + "的消息为:"+ 메시지); 
            } 캐치(UnknownHostException의 전자) {
                 // TODO 자동 생성 된 catch 블록의 
                e.printStackTrace (); 
            } 
            
        } 
        
    } 
 
}

셋째, 테스트 실행

공용  클래스 UDPSocketRun { 
    
    공공  정적  무효 메인 (문자열 [] 인수)이 발생 하는 Throwable { 
        DatagramSocket로 보내기 = 새로운 DatagramSocket로를 (); 
        DatagramSocket를 수신 = 새로운 DatagramSocket로 (8088 );
        새로운 스레드 ( UDPSocketClientThread (송신)) (시작).;
        새로운 스레드 (   UDPSocketServerThread () 수신) (시작).; 
    } 
}

 

 

추천

출처www.cnblogs.com/hellohero55/p/11992788.html