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 }

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 }

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 }

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 }

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 }

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 }

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 }

时间: 2024-08-08 17:54:41

java服务端和用户端的相关文章

现代Java服务端开发核心技术之开发工具箱

现代Java服务端开发核心技术之开发工具箱 现代Java服务端开发核心技术 2.1 开发工具概述 俗话说,工欲善其事必先利其器,掌握一些日常开中常用的工具软件能够大大提开发效率,工具本身的目的也是解放生产力.在安装各种软件时注意如果没有特殊需要不必使用最新版本,尤其是操作系统,例如当前(2018/10/12)最新版的macOS是10.14,但是运行在macOS之上的其他应用软件可能还没有及时做兼容新系统的版本,可能在系统升级之后无法正常使用,因此推荐在新系统正式推出半年后再升级最为稳妥. 而且软

现代Java服务端开发核心技术之CentOS7.5安装MySQL5.7

现代Java服务端开发核心技术之CentOS7.5安装MySQL5.7 现代Java服务端开发核心技术 1.首先检查系统中是否已经安装过MySQL,以下提供两种方式 [[email protected] Downloads]# yum list installed |grep mysql [[email protected] Downloads]# rpm -qa|grep mysql 如果已经安装过,可以使用如下命令删除 [[email protected] Downloads]# yum -

现代Java服务端开发核心技术之分布式数据库中间件MyCAT入门

现代Java服务端开发核心技术之分布式数据库中间件MyCAT入门 现代Java服务端开发核心技术 MyCAT系统环境搭建 如下列表展示了搭建MyCAT运行时环境所需要的软件及其版本说明. 软件名称 软件版本 os centos7.5 JDK JDK1.8u191 MySQL MySQL5.7 Mycat Mycat1.6.5 Navicat Navicat12.08 在非集群的环境下,MyCAT仅仅依赖JDK就可以良好的运行在Windows,Linux,macOS等操作系统之上. CentOS7

现代Java服务端开发核心技术之数据库中间件MyCAT入门

现代Java服务端开发核心技术之数据库中间件MyCAT入门 现代Java服务端开发核心技术 MyCAT系统环境搭建 如下列表展示了搭建MyCAT运行时环境所需要的软件及其版本说明. 软件名称 软件版本 os centos7.5 JDK JDK1.8u191 MySQL MySQL5.7 Mycat Mycat1.6.5 Navicat Navicat12.08 SecureCRT Linux客户端 在非集群的环境下,MyCAT仅仅依赖JDK就可以良好的运行在Windows,Linux,macOS

hessian 通信,C#客户端调用java服务端服务

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据(来自百度) 本次通过hessian简单实现C#调用java服务,并返回java方法的结果,其中C#以及java方法的参数可以是Entity. 1. 依赖 java包及DLL   1.1 hessian-4.0.37.jar   1.2 Hessiancsharp.d

RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 其中使用到RPC学习----Thrift快速入门和Java简单示例,这篇文章创建的Java服务端. 一.C#中使用Thrift简介 关于rpc的简介,可以参考:RPC学习----Thrift快速入门和Java简单示例 1.下载thrift 1)点击下载:thrift-0.9.1.tar.gz(或者http://thrift.apache.org/download) 2)

android客户端和java服务端用aes加密

最近在公司做一个项目,老大让我们实现加解密的方法,我把工作直接推给了java服务端,他们也是直接在网上copy的代码,说我直接放到我的android代码中就可以了,不需要太多的更改.我就照做了,但是在真正的测试的时候,发现两边输入的密码一致,但是加密结果不一致.这可折磨我们了好久,最终解决了这个问题,加以记录. android和java加密结果不一样的原因,是因为他们的默认随机数序列不一致,所以解决他的办法是,不要使用默认的创建方法. 以下是正确的代码.android和java端的代码是一致的.

JPush简单Java服务端案例实现

一.激光推送准备工作 1.注册极光推送开发者账号,创建应用: 2.完成推送设置,填写应用名提交生成安装包: 3.扫码安装简单的测试apk,查看应用信息会有AppKey和Master Secret用于推送. 二.java服务端 所需jar包和详细具体集成可以查看官方文档,这里只是实现了一个简单的通知或推送消息. import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.jiguang.common.resp.APIConn

ajax跨域请求,页面和java服务端的写法

页面ajax请求的写法: $.ajax({ type : "get", async : false, cache : false, url : "http://localhost:8081/a/b", data : { produ_id: 111, sub_id: 0, produ_quantity: 1, produ_price: 0.0 }, dataType : "jsonp", jsonp: "jsonpCallback&quo