• 简单的多线程实例


    实现了在服务器端通过两个线程来监听socket请求和处理socket请求,并通过for循环来模拟整个时间段,当启动server程序后,每运行一次client程序都会在server端得到相应,代码如下:

    server端:

     1 import java.io.DataInputStream;
     2 import java.io.DataOutputStream;
     3 import java.io.IOException;
     4 import java.net.ServerSocket;
     5 import java.net.Socket;
     6 
     7 class DealThread extends Thread{ // socket请求处理线程
     8     private Socket socket;
     9     DealThread(Socket socket){
    10         super();
    11         this.socket = socket;
    12     }
    13     public void run(){
    14         try {
    15         //用于向客户端发送数据的输出流
    16         DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    17         //用于接收客户端发来的数据的输入流
    18         DataInputStream dis = new DataInputStream(socket.getInputStream());
    19         System.out.println("服务器接收到客户端的连接请求:" + dis.readUTF());
    20         //服务器向客户端发送连接成功确认信息
    21         dos.writeUTF("接受连接请求,连接成功!");
    22         } catch (IOException e) {
    23             e.printStackTrace();
    24         }
    25     }
    26 }
    27 class ListenerThread extends Thread{ // 监听socket连接的线程
    28 
    29     ListenerThread(){
    30         super();
    31     }
    32     public void run() {         
    33              ServerSocket ss = null;
    34         try {
    35             ss = new ServerSocket(8888);
    36             while(true)
    37             {
    38                 //服务器接收到客户端的数据后,创建与此客户端对话的Socket
    39                 Socket socket = ss.accept();
    40 
    41                 // socket处理线程
    42                 DealThread d = new DealThread(socket); 
    43                 d.start();
    44                 /*//用于向客户端发送数据的输出流
    45                 DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    46                 //用于接收客户端发来的数据的输入流
    47                 DataInputStream dis = new DataInputStream(socket.getInputStream());
    48                 System.out.println("服务器接收到客户端的连接请求:" + dis.readUTF());
    49                 //服务器向客户端发送连接成功确认信息
    50                 dos.writeUTF("接受连接请求,连接成功!");*/
    51                 //不需要继续使用此连接时,关闭连接
    52                 if(socket.isClosed())
    53                     socket.close();
    54                 if(ss.isClosed())
    55                     ss.close();
    56             }
    57         } catch (IOException e) {
    58             e.printStackTrace();
    59         }
    60     }
    61 }
    62 
    63 
    64 public class server {
    65 
    66     /**
    67      * 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,
    68      *      而后才可以向客户端发送信息,否则将会有运行时出错。
    69      * @param args
    70      * @throws IOException 
    71      */
    72     public static void main(String[] args) {
    73 
    74         ListenerThread l = new ListenerThread();
    75         l.start();
    76         for(int i = 0;i<100;i++)  // 模拟时间片的过程
    77         {
    78             try {
    79                 Thread.sleep(1000);
    80             } catch (InterruptedException e) {
    81                 // TODO Auto-generated catch block
    82                 e.printStackTrace();
    83             }
    84             System.out.println(i);
    85         }
    86     }
    87 
    88 }


    client端:

     1 import java.io.DataInputStream;
     2 import java.io.DataOutputStream;
     3 import java.io.IOException;
     4 import java.io.OutputStream;
     5 import java.net.Socket;
     6 import java.net.UnknownHostException;
     7 
     8 public class Client {
     9 
    10     /**
    11      * @param args
    12      */
    13     public static void main(String[] args) {
    14         Socket socket = null;
    15         try {
    16             socket = new Socket("localhost",8888);
    17             //获取输出流,用于客户端向服务器端发送数据
    18             DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    19             //获取输入流,用于接收服务器端发送来的数据
    20             DataInputStream dis = new DataInputStream(socket.getInputStream());
    21             //客户端向服务器端发送数据
    22             dos.writeUTF("我是客户端,请求连接!");
    23             //打印出从服务器端接收到的数据
    24             System.out.println(dis.readUTF());
    25             //不需要继续使用此连接时,记得关闭哦
    26             socket.close();
    27         } catch (UnknownHostException e) {
    28             System.out.println("没有找到服务器");
    29             e.printStackTrace();
    30         } catch (IOException e) {
    31             System.out.println("没有找到IO流");
    32             e.printStackTrace();
    33         }
    34     }
    35 
    36 }
    37  

    输出结果为:

    server端:

    0
    1
    2
    3
    4
    服务器接收到客户端的连接请求:我是客户端,请求连接!  (每次运行一次client程序时出现)
    5
    6
    7
    8
    9
    10
    11
    12
    服务器接收到客户端的连接请求:我是客户端,请求连接! (每次运行一次client程序时出现)
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99

    client端:

    接受连接请求,连接成功!

  • 相关阅读:
    数据库分区与分表
    Paxos算法简单介绍
    Zookeeper实现分布式锁服务(Chubby)
    java.lang.OutOfMemoryError: Java heap space错误及处理办
    关于分布式事务、两阶段提交协议、三阶提交协议
    Volatile
    寻找数组中只出现一次的数
    堆排序
    二叉树遍历 递归非递归
    redis 数据类型
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2505784.html
Copyright © 2020-2023  润新知