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 () 수신) (시작).; } }