zoukankan      html  css  js  c++  java
  • java服务端和用户端

    1.server

    Logintherad:

     1 package com.zdsofe.server;
     2 
     3 import java.io.InputStream;
     4 import java.io.OutputStream;
     5 import java.net.Socket;
     6 import java.util.Set;
     7 
     8 /**
     9  * 主要用于用户登录
    10  * 
    11  * @author Administrator
    12  *
    13  */
    14 public class Logintherad extends Thread
    15 {
    16     Socket client;
    17     int n;// n的值表示用户是否连接上
    18 
    19     public Logintherad(Socket client)
    20     {
    21         this.client = client;
    22     }
    23 
    24     @Override
    25     public void run()
    26     {
    27         try
    28         {
    29             // 调用登录处理的方法
    30             loginServer();
    31             // 判断是否登录成功
    32             if (n == 1)
    33             {
    34                 // 开启发送信息的线程
    35                 new SendThread(client).start();
    36             }
    37         } catch (Exception e)
    38         {
    39 
    40             e.printStackTrace();
    41         }
    42     }
    43 
    44     // 登录处理方法
    45     private void loginServer() throws Exception
    46     {
    47         // 获取输入流
    48         InputStream inputStream = client.getInputStream();
    49         // 获取输出流
    50         OutputStream outputStream = client.getOutputStream();
    51         // 创建数组用来存放读取的昵称
    52         byte[] bytes = new byte[1024];
    53         // 从流里读取客服的昵称,放入数组中
    54         inputStream.read(bytes);
    55         // 把数组转化为String类型
    56         String nickName = new String(bytes);
    57         // 保存昵称到Set集合
    58         boolean b = UserInfo.nickNames.add(nickName);
    59         // 判断登录的状态
    60         if (b)
    61         {
    62             n = 1;
    63             // 登录成功
    64             outputStream.write("1".getBytes());
    65             // 登录成功后把用户信息存放在hashMap集合中
    66             UserInfo.hashMap.put(client, nickName);
    67             // 获取hashMap集合的键,也就是获取用户
    68             Set<Socket> set = UserInfo.hashMap.keySet();
    69             // 遍历set集合,发送登录成功的信息给其他客户,
    70             for (Socket socket : set)
    71             {
    72                 if (client != socket)// 排除把登录成功的信息发送给自己
    73                 {
    74                     OutputStream os = socket.getOutputStream();
    75                     // 输出客户上线
    76                     os.write((nickName + "上线了").getBytes());
    77                 }
    78             }
    79 
    80         } else
    81         {
    82             n = 0;
    83             // 登录失败,输出0
    84             outputStream.write("0".getBytes());
    85         }
    86     }
    87 
    88 }
    View Code

    SendThread:

     1 package com.zdsofe.server;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.net.Socket;
     6 import java.util.Set;
     7 
     8 /**
     9  * 发送信息的线程
    10  * 
    11  * @author Administrator
    12  *
    13  */
    14 public class SendThread extends Thread
    15 {
    16     Socket socket;
    17     public SendThread(Socket socket)
    18     {
    19         this.socket = socket;
    20     }
    21 
    22     @Override
    23     public void run()
    24     {
    25         while (true)
    26         {
    27             try
    28             {
    29                 // 创建输入流
    30                 InputStream inputStream = socket.getInputStream();
    31                 // 创建数组
    32                 byte[] bytes = new byte[1024];
    33                 // 把信息存入字节数组里
    34                 inputStream.read(bytes);
    35                 // 把数组转化为String类型
    36                 String s = new String(bytes);
    37                 // 获取所有客户端的列表
    38                 Set<Socket> set = UserInfo.hashMap.keySet();
    39                 // 遍历set集合,得到所有用户
    40                 for (Socket socket : set)
    41                 {
    42                     // 使用户得到输出的信息
    43                     socket.getOutputStream().write(s.getBytes());
    44                 }
    45             } catch (IOException e)
    46             {
    47                 e.printStackTrace();
    48             }
    49 
    50         }
    51     }
    52 
    53 }
    View Code

    TestServer:

     1 package com.zdsofe.server;
     2 
     3 import java.io.IOException;
     4 import java.net.ServerSocket;
     5 import java.net.Socket;
     6 
     7 public class TestServer
     8 {
     9 
    10     public static void main(String[] args)
    11     {
    12         try
    13         {
    14             // 创建服务器
    15             ServerSocket serverSocket = new ServerSocket(8000);
    16             while (true)
    17             {
    18                 // 等待客服连接
    19                 Socket socket = serverSocket.accept();
    20                 // 调用线程(登录和发消息的线程)
    21                 new Logintherad(socket).start();
    22             }
    23         } catch (IOException e)
    24         {
    25             e.printStackTrace();
    26         }
    27 
    28     }
    29 
    30 }
    View Code

    UserInfo:

     1 package com.zdsofe.server;
     2 
     3 import java.net.Socket;
     4 import java.util.HashMap;
     5 import java.util.HashSet;
     6 import java.util.Set;
     7 
     8 /**
     9  * 保存用户信息
    10  * 
    11  * @author Administrator
    12  *
    13  */
    14 public class UserInfo
    15 {
    16     // 连接信息存在hashMap集合里
    17     public static HashMap<Socket, String> hashMap = new HashMap<Socket, String>();
    18     // 把用户的昵称信息存入set集合
    19     public static Set<String> nickNames = new HashSet<String>();
    20 
    21 }
    View Code

    2.socket

    ReceiveThread:

     1 package com.zdsofe.socket;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.net.Socket;
     6 
     7 public class ReceiveThread extends Thread
     8 {
     9  private  Socket socket;
    10 
    11 public ReceiveThread(Socket socket)
    12 {
    13     
    14     this.socket = socket;
    15 }
    16 
    17 @Override
    18 public void run()
    19 {
    20     while(true)
    21     {    
    22     try
    23     {
    24         //创建输入流
    25         InputStream inputStream=socket.getInputStream();
    26         //创建字节数组
    27         byte[]bytes=new byte[1024];
    28         //把读的数据放在数组里
    29         inputStream.read(bytes);
    30         //转化为字符串类型并打印
    31         System.out.println(new String(bytes));
    32         
    33     } catch (IOException e)
    34     {
    35         
    36         e.printStackTrace();
    37     }
    38     }
    39 }
    40  
    41 }
    View Code

    SendThread:

     1 package com.zdsofe.socket;
     2 
     3 import java.io.IOException;
     4 import java.io.OutputStream;
     5 import java.net.Socket;
     6 import java.util.Scanner;
     7 
     8 public class SendThread extends Thread
     9 {
    10  private Socket socket;
    11 
    12 public SendThread(Socket socket)
    13 {    
    14     this.socket = socket;
    15 }
    16 
    17 @Override
    18 public void run()
    19 {
    20     //开启键盘扫描
    21     Scanner sc=new Scanner(System.in);
    22     while(true)
    23     {
    24         String s=sc.nextLine().trim();
    25         try
    26         {    
    27             //创建输出流
    28             OutputStream outputStream=socket.getOutputStream();
    29             //把字符串转化为字节,并写入
    30             outputStream.write(s.getBytes());
    31             
    32         } catch (IOException e)
    33         {
    34             
    35             e.printStackTrace();
    36         }
    37     }
    38 }
    39 }
    View Code

    TestUers:

     1 package com.zdsofe.socket;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.net.Socket;
     7 import java.util.Scanner;
     8 
     9 public class TestUers
    10 {
    11     // 服务器的IP地址
    12     private static String IP = "192.168.10.183";
    13     // 服务器的端口
    14     private static int DUAN = 8000;
    15 
    16     public static void main(String[] args) throws Exception
    17     {
    18         try
    19         {
    20             //创建Socket连接
    21             Socket socket = new Socket(IP, DUAN);            
    22             System.out.println("请输入昵称进行验证");
    23             //开启键盘扫描
    24             Scanner sc = new Scanner(System.in);
    25             String nickName = sc.nextLine().trim();
    26             //判断昵称是否为空
    27             if (nickName.equals(""))
    28             {
    29                 System.out.println("昵称不能为空");
    30                 return;
    31             }
    32             // 开始登陆
    33             loginServer(socket, nickName);
    34             // 开启发送的线程
    35             new SendThread(socket).start();
    36             // 开启接受的线程
    37             new ReceiveThread(socket).start();
    38         } catch (IOException e)
    39         {
    40             e.printStackTrace();
    41         }
    42 
    43     }
    44 
    45     // 登录的方法
    46     public static void loginServer(Socket socket, String nickName)
    47             throws Exception
    48     {
    49         // 获取输出流
    50         OutputStream outputStream = socket.getOutputStream();
    51         //把昵称写入
    52         outputStream.write(nickName.getBytes());
    53         // 获取输入流
    54         InputStream inputStream = socket.getInputStream();
    55         //创建字节数组
    56         byte[] bytes = new byte[1024];
    57         //把读取的信息存入数组里
    58         inputStream.read(bytes);
    59         //把数组转化为字符串类型
    60         String s = new String(bytes).trim();
    61         //判断登录是否成功
    62         if (s.equals("1"))
    63         {
    64             System.out.println("登录成功");
    65         } else if (s.equals("0"))
    66         {
    67             System.out.println("昵称重复");
    68         } else
    69         {
    70             System.out.println("服务器异常");
    71         }
    72 
    73     }
    74 }
    View Code
  • 相关阅读:
    html5 video标签如何禁止视频下载
    Redis源代码-数据结构Adlist双端列表
    HTML5分析实战WebSockets基本介绍
    Chromium on Android: Android在系统Chromium为了实现主消息循环分析
    Android AIDL使用特定的解释
    [LeetCode]Maximum Product Subarray
    OC省字典的数组摘要集
    CocoaChina 第四个测试
    Java在的时候,类定义HashSet初始化方法
    WSHPSRS-匹克选择列表生成器-SRS(R12.2.3)
  • 原文地址:https://www.cnblogs.com/zclqian/p/7233304.html
Copyright © 2011-2022 走看看