学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度

 

学习过程:

上一节的中我们只是实现了一次通讯,下面我们要做的例子可以允许多个客户机,多次发送信息给服务器。
 

一、思路

要实现这个功能,服务器需要不断的等待新的客户机连接,每一个新的客户机连接,我们就启动一个新的线程来维护与当前的客户机的socket连接,客户输入“bye”是,这个客户就退出。如果你忘记了线程,最好先回去复习一下。思路图如下:

60、使用多线程监听多客户端

二、实现代码

1、与客户端对应的线程类。实现代码如下:

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

 /**

 * 与每一个客户端对应的线程

 

 * @author Administrator

 

 */

public class SocketThread extends Thread {

 

    private Socket socket;//对应的socket

    private String name;

    private BufferedReader in;

    private PrintWriter pw;

 

    public SocketThread(String name, Socket socket) {

        this.name = name;

        this.socket = socket;

 

        try {

            in = new BufferedReader(new InputStreamReader(

                    socket.getInputStream()));

 

            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(

                    socket.getOutputStream())));

 

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

    }

 

    public void run() {

         

        pw.println("欢迎:"+name);

        pw.flush();

         

        try {

            String temp = in.readLine();

            while (true) {

                System.out.println("客户端发来的信息:" + temp);

 

                temp = in.readLine();

 

                if (temp.equals("bye")) {

                    break;

                }

 

            }

             

            in.close();

            pw.flush();

            pw.close();

            socket.close();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

 

}

2、服务端代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 public class Server {

 

    public static void main(String[] args) throws IOException {

        // 构造服务器端的soucket,监听端口

        ServerSocket serverSocket = new ServerSocket(6001);

 

        System.out.println("服务器启动,等待客户端的链接...");

        // 程序在此定下来,等待客户端的链接

        int i=0;

        //不断等待客户端的链接

        while(true){

            Socket socket = serverSocket.accept();

            i++;

            //启动一个线程,

            SocketThread socketThread=new SocketThread

            (socket.getInetAddress().getHostName()+":"+i, socket);

             

            socketThread.start();

        }

         

    }

 

}

3、客户端代码。

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

public class Client {

 

    public static void main(String[] args) throws UnknownHostException,

            IOException {

        // 指定ip和端口

        Socket socket = new Socket(InetAddress.getByName("192.168.11.144"),

                6001);

 

        // 接受服务器发来的信息

        BufferedReader br = new BufferedReader(new InputStreamReader(

                socket.getInputStream()));

 

        System.out.println("服务端发来的信息:" + br.readLine());

 

        // 发送一条信息给服务器

        PrintWriter pw = new PrintWriter(new BufferedWriter(

                new OutputStreamWriter(socket.getOutputStream())));

        pw.println("liu");

        pw.flush();

        Scanner scanner = new Scanner(System.in);

        String temp = null;

        while (true) {

            System.out.print("说话:");

            temp = scanner.next();

            pw.println(temp);

            pw.flush();

            if (temp.equals("bye")) {

                break;

            }

 

        }

 

        pw.close();

 

        socket.close();

 

    }

 

}

4、测试。

把所有的类复制到D:盘中,使用Dos控制台,服务器使用一个控制台,每一个客户端一个Dos控制台。

也是先编译,然后启动服务类:

60、使用多线程监听多客户端

这时候你可以多打开几个Dos控制台运行客户机类。

60、使用多线程监听多客户端

这节课的内容比较需要好好理解,为明天我们做一个多人聊天系统做好准备,希望大家先把这节课的内容好好理解后,再看明天的内容。

相关文章:

  • 2021-12-01
  • 2021-04-13
  • 2021-11-17
  • 2021-09-02
  • 2021-12-05
  • 2021-05-24
  • 2022-12-23
猜你喜欢
  • 2021-05-25
  • 2021-08-21
  • 2021-12-12
  • 2021-09-08
  • 2021-11-17
  • 2021-06-25
  • 2021-07-03
相关资源
相似解决方案