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

学习目标:

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

学习过程:

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

一、思路

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

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

二、实现代码

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值