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

学习目标:

1、结合服务器端多线程处理客户端连接

学习过程:

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

一、思路

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

attcontent/c0346ac1-d838-42a1-86f3-eeed7d140d7f.png

二、实现代码

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

1

2

扫描二维码关注公众号,回复: 3960193 查看本文章

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控制台。

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

attcontent/cc41c7ac-37d6-4210-b96c-f27865605248.png

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

attcontent/2199021d-4997-44dd-9119-33b3baaa00ca.png

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

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/83753430