TCP / IP UDPはトランスポート層に基づいており、およびUDP送信データの損失の状況は、逃げるために、過去に送信され、データ受信が受信されない送信にかかわらず、相手の、発生します。
パケットにカプセル化されたソースおよび宛先データを、接続を確立していない(のDatagramPacketの)UDPがあります
各データのサイズが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 ){ // TODO自動生成されたブロックキャッチ e.printStackTrace(); } }
二、サーバー終了
パブリック クラスUDPSocketServer { 公共 静的 ボイドメイン(文字列[]引数)がスローされたThrowable { // ;)(受信 Keyreceive(); } プライベート 静的 ボイド Keyreceive()スローされたThrowable { // 。1、および指定されたポートを作成し、UDPソケット DatagramSocketのソケット=を新しい新規のDatagramSocket(8088 ); 一方、(真の){ // 2、受信すべきデータパケットを定義する バイト []バイト= 新しい新しい バイト [1024 ]; 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 = nullを。 試す{ InetAddressの = のInetAddress.getLocalHost()。 System.out.println(inetAddress.getHostAddress() + "的消息为:" + メッセージ)。 } キャッチ(UnknownHostExceptionが電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); } } } }
第三に、テスト実行
パブリック クラスUDPSocketRun { 公共 静的 ボイドメイン(文字列[]引数)がスローされたThrowableを{ たDatagramSocket送信 = 新しいDatagramSocketの()。 DatagramSocketのは、受信 = 新しいのDatagramSocket(8088 ); 新しいスレッド(新しいUDPSocketClientThread(送信))(開始)。 新しいスレッド(新しい UDPSocketServerThread(受信)))(開始。 } }