zoukankan      html  css  js  c++  java
  • 多线程_TCP编程

    java源码示例展示:

    服务端:

     1 package tcp2;
     2 
     3 import java.io.IOException;
     4 import java.net.InetAddress;
     5 import java.net.ServerSocket;
     6 import java.net.Socket;
     7 
     8 /**
     9  * 登录的服务器
    10  * @author superdrew 
    11  *     TCP 登录 
    12  *    功能:用户在客户端输入用户名和密码提交给服务器,服务器接收并处理,处理完后给客户端一个返回信息
    13  *        客户端接口服务器的反馈消息并输出
    14  *    缺点:服务器处理一次用户请求之后,就关闭了
    15  *            应该是服务器一直监听,可以处理多个用户的请求
    16  *        使用while循环类似达到效果,但是不可以
    17  *        不是并行,是串行的。请求一次,只能等待该次请求执行完毕
    18  *        
    19  *        问题:学生1-------咨询1     学生2---------咨询1 学    生3------------咨询1
    20  *        
    21  *        解决:
    22  *        学生1------------        ---------------咨询1            
    23  *        学生2    ------------ 前台接待  ---------------咨询2
    24  *        学生3------------       ----------------咨询3
    25  *      
    26  *      使用线程来处理
    27  */
    28 public class LoginServer {
    29     public static void main(String[] args) throws IOException {
    30         //1.创建一个serversocket  创建服务
    31         @SuppressWarnings("resource")
    32         ServerSocket serverSocket = new ServerSocket(8888);//端口 8888  IP地址是本机
    33         int i =1;
    34         while(true){
    35             Socket socket = serverSocket.accept();
    36             InetAddress ia = socket.getInetAddress();
    37             new LoginThread(socket).start();
    38             System.out.println("第"+ i++ +"个人来访问,访问者ip是:"+ia.getHostAddress());
    39         }
    40     }
    41 }
    LoginServer.java

    客户端:

     1 package tcp2;
     2 
     3 import java.io.DataInputStream;
     4 import java.io.DataOutputStream;
     5 import java.io.IOException;
     6 import java.io.OutputStream;
     7 import java.net.InetAddress;
     8 import java.net.Socket;
     9 import java.net.UnknownHostException;
    10 import java.util.Scanner;
    11 
    12 /**
    13  * 登录的客户端
    14  * @author superdrew
    15  *
    16  */
    17 public class LoginClient {
    18     public static void main(String[] args) throws UnknownHostException, IOException {
    19         //1.创建一个socket  连接服务器
    20         Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//必须要知道服务器IP和端口号
    21         @SuppressWarnings("resource")
    22         Scanner sc = new Scanner(System.in);
    23         //2.通过 socket 发送数据给服务器
    24         //OutputStream os = new FileOutputStream("d:/b.txt");输出到文件
    25         System.out.println("请输入登入信息:");
    26         String info = sc.nextLine();
    27         OutputStream os = socket.getOutputStream();
    28         DataOutputStream dos = new DataOutputStream(os);
    29         dos.writeUTF(info);
    30         //3.接收服务器返回的消息
    31         DataInputStream dis = new DataInputStream(socket.getInputStream());
    32         String result = dis.readUTF();
    33         System.out.println("服务器返回的消息response:"+result);
    34         
    35         //4.关闭资源
    36         dis.close();
    37         dos.close();
    38         socket.close();
    39     }
    40 }
    LoginClient.java

    多人登入的线程:

     1 package cn.com.sxt.tcp2;
     2 
     3 import java.io.DataInputStream;
     4 import java.io.DataOutputStream;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.net.Socket;
     8 
     9 /**
    10  * 登录线程
    11  * @author superdrew
    12  *
    13  */
    14 public class LoginThread extends Thread{
    15     private Socket socket;
    16     
    17     public void setSocket(Socket socket){
    18         this.socket = socket;
    19     }
    20     
    21     public LoginThread(Socket socket){
    22         this.socket = socket;
    23     }
    24     
    25     public void run() {
    26         InputStream is;
    27         DataOutputStream dos = null;
    28         DataInputStream dis = null;
    29         
    30         try {
    31             is = socket.getInputStream();
    32             dis = new DataInputStream(is);
    33             String result = dis.readUTF();
    34             System.out.println("客户端发送来的消息:"+result);
    35             //4.给客户端反馈一个消息 
    36             dos = new DataOutputStream(socket.getOutputStream());
    37             if("superdrew".equals(result)){
    38                 dos.writeUTF("登录成功");
    39             }else{
    40                 dos.writeUTF("登录失败");
    41             }
    42         } catch (IOException e) {
    43             e.printStackTrace();
    44         }finally{
    45             try {
    46                 if(dos!=null){
    47                     dos.close();//关闭dos
    48                 }
    49             } catch (IOException e) {
    50                 e.printStackTrace();
    51             }
    52             try {
    53                 if(dis!=null){
    54                     dis.close();//关闭dis
    55                 }
    56             } catch (IOException e) {
    57                 e.printStackTrace();
    58             }
    59             try {
    60                 if(socket!=null){
    61                     socket.close();//关闭socket
    62                 }
    63             } catch (IOException e) {
    64                 e.printStackTrace();
    65             }
    66         }
    67         
    68     }
    69 }
    LoginThread.java

    操作步骤:

    ①运行服务端;②运行客户端;③输入登入信息为superdrew;④在console窗口下点击,可以看到这是第几次登入以及相关记录的信息;

    结果展示---如图:

  • 相关阅读:
    Spark函数详解系列之RDD基本转换
    Spark算子之aggregateByKey详解
    基于Apache Spark机器学习的客户流失预测
    Spark partitionBy
    Spark中repartition和partitionBy的区别
    Spark快速获得CrossValidator的最佳模型参数
    Spark MLlib之水塘抽样算法(Reservoir Sampling)
    机器学习-加权采样算法简介
    基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘(转)
    Mark 装修建材 清单
  • 原文地址:https://www.cnblogs.com/superdrew/p/8098619.html
Copyright © 2011-2022 走看看