好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

基于UDP实现聊天室功能

本文实例为大家分享了UDP实现聊天室功能的具体代码,供大家参考,具体内容如下

项目结构

data.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package udp;

 

import java.net.InetAddress;

 

public class data {

  InetAddress Address;

  int Port;

  public InetAddress getAddress() {

   return Address;

  }

  public void setAddress(InetAddress address) {

   Address = address;

  }

  public int getPort() {

   return Port;

  }

  public void setPort( int port) {

   Port = port;

  }

}

服务器端

Server.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

package udp;

 

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.util.ArrayList;

 

public class Server {

  DatagramSocket socket = null ;

  ArrayList<data> client;

 

  public Server() {

   try {

    socket = new DatagramSocket( 8888 );

   } catch (SocketException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

   client = new ArrayList<data>();

  }

 

  public void s_r(){

   try {

   

    while ( true ) {

     byte [] buf = new byte [ 3000 ];

     //接收数据的数据包

     DatagramPacket packet = new DatagramPacket(buf,buf.length);

     socket.receive(packet);

     //地址

     InetAddress clientAddress = packet.getAddress();

     //端口号   

     int clientPort = packet.getPort();

     data d = new data();

     d.setAddress(clientAddress);

     d.setPort(clientPort);

     int i= 0 ;

     //判断客户端集合里是否存在发送新消息的客户端

     for (;i<client.size();i++) {

      if (client.get(i).getAddress().equals(clientAddress)&&client.get(i).getPort()==clientPort) {

       break ;

      }

     }

     if (i==client.size()) {

      client.add(d);

     }

     String s= new String(packet.getData()).trim()+ "来自:" +clientAddress.getHostAddress()+ ":" +clientPort;

     System.out.println(s);

     //把信息发给每个客户端

     for (data c:client) {

      try {

       //地址

       InetAddress cAddress = c.getAddress();

       //端口号

       int cPort = c.getPort();

      

       buf = s.getBytes();

       //创建要发送的数据包

       packet = new DatagramPacket(buf,buf.length,cAddress,cPort);

       socket.send(packet);

       } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

       }

      }   

    }

   } catch (SocketException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   } finally {

    if (socket!= null )socket.close();

   }

  

  } 

  public static void main(String[] args) {

   Server s = new Server();

   s.s_r();

  }

}

客户端

package udp;

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;

 

public class Client {

  DatagramSocket socket = null ;

  DatagramPacket packet;

  InetAddress address = null ;

  Client(){

   try {

    socket = new DatagramSocket();

   } catch (SocketException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   } 

  }

 

  public void s_r() {

   try {

    // 把表示服务器端IP地址的字符串转换成InetAddress对象

    address = InetAddress.getByName( "127.0.0.1" );

    } catch (UnknownHostException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

   } 

   String s = "登陆" ;

   byte [] b = s.getBytes();

   packet = new DatagramPacket(b,b.length,address, 8888 );

   try {

    socket.send(packet);

   } catch (IOException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

   }

 

   //发送消息的线程

    new Thread( new Runnable() {

     @Override

     public void run() {

      // TODO Auto-generated method stub

      String sendStr;

      BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in));

      try {

       while ((sendStr = stdIn.readLine())!= null ) {

        byte [] buf = sendStr.getBytes();

        packet = new DatagramPacket(buf,buf.length,address, 8888 );

        socket.send(packet);

       }

      } catch (IOException e) {

       // TODO Auto-generated catch block

       e.printStackTrace();

      }    

     }

    

    }).start();

 

    //接收消息的线程

    new Thread( new Runnable() {

 

     @Override

     public void run() {

      // TODO Auto-generated method stub

      byte [] buf_1 = new byte [ 3000 ];

      // 使用空字节数组构造空数据包

      DatagramPacket packet = new DatagramPacket(buf_1,buf_1.length);

      try {

        while ( true ) {

         socket.receive(packet);

         String received = new String(packet.getData(), 0 ,packet.getLength()).trim();

         System.out.println( "接收到的信息:" +received);

        }

          

      } catch (IOException e) {

       // TODO Auto-generated catch block

       e.printStackTrace();

      }

     }

    }).start();

  }

 

  public static void main(String[] args) {

   Client c = new Client();

   c.s_r();

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/qq_43496829/article/details/104553025

查看更多关于基于UDP实现聊天室功能的详细内容...

  阅读:15次