初心者のネットプログラミングのUDP実現チャットルーム

16626 ワード

初心者のネットプログラミングのUDP実現チャットルーム
前の文章はTCPプロトコルを使って非常に簡単なチャットを実現しました.クライアントとサービス側が存在し、クライアントとサービス側は相互接続に成功しなければデータ伝送を行うことができません.(「電話をかける」のように、つながってからお互いに音声を受け取ることができます).
UDPプロトコルは異なり、サービス側は必要なく、送信されたファイルも相手と接続に成功したかどうかを確認する必要はありません.△メールを送るように、相手の状態にかかわらず、いつでも送ることができます.
概要
チャットルームで最も重要なのは、互いにメッセージを送信し、メッセージを受信することであり、ここではマルチスレッド技術に関連している.
この例はJava初心者が参考使用を練習し、コレクションを提案し、コードを作成し、各行の役割を体得するのに適しています.
ソースコード
チャット情報クラスの送信
package UDPchatEachOther;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class TalkSend implements Runnable {

   DatagramSocket socket =null;
   BufferedReader reader = null;

 private int fromPort;
   private String toIP;
   private int toPort;

   public TalkSend(int fromPort, String toIP, int toPort) throws Exception {
       this.fromPort = fromPort;
       this.toIP = toIP;
       this.toPort = toPort;

       try {
           //
           socket=new DatagramSocket(fromPort);
           reader = new BufferedReader(new InputStreamReader(System.in));
      }catch (Exception e){
           e.printStackTrace();
      }

  }
   @Override
   public void run() {

       while (true) {
           String data = null;
           try {
               data = reader.readLine();   //
               byte[] datas = data.getBytes();     // byte

               DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));

               socket.send(packet);
               if(data.equals("bye")){
                   break;
              }
          } catch (IOException e) {
               e.printStackTrace();
          }

      }
       socket.close();
  }
}

チャット情報クラスの受信
package UDPchatEachOther;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class TalkReceive implements Runnable {

   DatagramSocket socket =null;    //
   private int port;               //
   private String msgFrom;         //

   public TalkReceive(int port,String msgFrom) {
       this.port = port;
       this.msgFrom=msgFrom;
       try{
           socket = new DatagramSocket(port);
      }catch (Exception e){
           e.printStackTrace();
      }
  }

   @Override
   public void run() {

       while (true) {
           try {
               //
               byte[] container = new byte[1024];
               DatagramPacket packet = new DatagramPacket(container, 0, container.length);
               socket.receive(packet);

               //
               byte[] data = packet.getData();
               String str = new String(data, 0, data.length);
               System.out.println(msgFrom+":"+str);

               // bye
               if(str.equals("bye")){
                   break;
              }
          } catch (IOException e) {
               e.printStackTrace();
          }


      }
       socket.close();
  }
}

ユーザー1
package UDPchatEachOther;

public class user1 {
   public static void main(String[] args) throws Exception {
       new Thread(new TalkSend(7777,"localhost",9999)).start();
       new Thread(new TalkReceive(8888,"user2")).start();
  }
}

ユーザー2
package UDPchatEachOther;

public class user2 {
   public static void main(String[] args) throws Exception {
       new Thread(new TalkSend(5555,"localhost",8888)).start();
       new Thread(new TalkReceive(9999,"user1")).start();
  }
}