1.server

Logintherad:

 package com.zdsofe.server;

 import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Set; /**
* 主要用于用户登录
*
* @author Administrator
*
*/
public class Logintherad extends Thread
{
Socket client;
int n;// n的值表示用户是否连接上 public Logintherad(Socket client)
{
this.client = client;
} @Override
public void run()
{
try
{
// 调用登录处理的方法
loginServer();
// 判断是否登录成功
if (n == 1)
{
// 开启发送信息的线程
new SendThread(client).start();
}
} catch (Exception e)
{ e.printStackTrace();
}
} // 登录处理方法
private void loginServer() throws Exception
{
// 获取输入流
InputStream inputStream = client.getInputStream();
// 获取输出流
OutputStream outputStream = client.getOutputStream();
// 创建数组用来存放读取的昵称
byte[] bytes = new byte[1024];
// 从流里读取客服的昵称,放入数组中
inputStream.read(bytes);
// 把数组转化为String类型
String nickName = new String(bytes);
// 保存昵称到Set集合
boolean b = UserInfo.nickNames.add(nickName);
// 判断登录的状态
if (b)
{
n = 1;
// 登录成功
outputStream.write("1".getBytes());
// 登录成功后把用户信息存放在hashMap集合中
UserInfo.hashMap.put(client, nickName);
// 获取hashMap集合的键,也就是获取用户
Set<Socket> set = UserInfo.hashMap.keySet();
// 遍历set集合,发送登录成功的信息给其他客户,
for (Socket socket : set)
{
if (client != socket)// 排除把登录成功的信息发送给自己
{
OutputStream os = socket.getOutputStream();
// 输出客户上线
os.write((nickName + "上线了").getBytes());
}
} } else
{
n = 0;
// 登录失败,输出0
outputStream.write("0".getBytes());
}
} }

SendThread:

 package com.zdsofe.server;

 import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Set; /**
* 发送信息的线程
*
* @author Administrator
*
*/
public class SendThread extends Thread
{
Socket socket;
public SendThread(Socket socket)
{
this.socket = socket;
} @Override
public void run()
{
while (true)
{
try
{
// 创建输入流
InputStream inputStream = socket.getInputStream();
// 创建数组
byte[] bytes = new byte[1024];
// 把信息存入字节数组里
inputStream.read(bytes);
// 把数组转化为String类型
String s = new String(bytes);
// 获取所有客户端的列表
Set<Socket> set = UserInfo.hashMap.keySet();
// 遍历set集合,得到所有用户
for (Socket socket : set)
{
// 使用户得到输出的信息
socket.getOutputStream().write(s.getBytes());
}
} catch (IOException e)
{
e.printStackTrace();
} }
} }

TestServer:

 package com.zdsofe.server;

 import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class TestServer
{ public static void main(String[] args)
{
try
{
// 创建服务器
ServerSocket serverSocket = new ServerSocket(8000);
while (true)
{
// 等待客服连接
Socket socket = serverSocket.accept();
// 调用线程(登录和发消息的线程)
new Logintherad(socket).start();
}
} catch (IOException e)
{
e.printStackTrace();
} } }

UserInfo:

 package com.zdsofe.server;

 import java.net.Socket;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set; /**
* 保存用户信息
*
* @author Administrator
*
*/
public class UserInfo
{
// 连接信息存在hashMap集合里
public static HashMap<Socket, String> hashMap = new HashMap<Socket, String>();
// 把用户的昵称信息存入set集合
public static Set<String> nickNames = new HashSet<String>(); }

2.socket

ReceiveThread:

 package com.zdsofe.socket;

 import java.io.IOException;
import java.io.InputStream;
import java.net.Socket; public class ReceiveThread extends Thread
{
private Socket socket; public ReceiveThread(Socket socket)
{ this.socket = socket;
} @Override
public void run()
{
while(true)
{
try
{
//创建输入流
InputStream inputStream=socket.getInputStream();
//创建字节数组
byte[]bytes=new byte[1024];
//把读的数据放在数组里
inputStream.read(bytes);
//转化为字符串类型并打印
System.out.println(new String(bytes)); } catch (IOException e)
{ e.printStackTrace();
}
}
} }

SendThread:

 package com.zdsofe.socket;

 import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner; public class SendThread extends Thread
{
private Socket socket; public SendThread(Socket socket)
{
this.socket = socket;
} @Override
public void run()
{
//开启键盘扫描
Scanner sc=new Scanner(System.in);
while(true)
{
String s=sc.nextLine().trim();
try
{
//创建输出流
OutputStream outputStream=socket.getOutputStream();
//把字符串转化为字节,并写入
outputStream.write(s.getBytes()); } catch (IOException e)
{ e.printStackTrace();
}
}
}
}

TestUers:

 package com.zdsofe.socket;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner; public class TestUers
{
// 服务器的IP地址
private static String IP = "192.168.10.183";
// 服务器的端口
private static int DUAN = 8000; public static void main(String[] args) throws Exception
{
try
{
//创建Socket连接
Socket socket = new Socket(IP, DUAN);
System.out.println("请输入昵称进行验证");
//开启键盘扫描
Scanner sc = new Scanner(System.in);
String nickName = sc.nextLine().trim();
//判断昵称是否为空
if (nickName.equals(""))
{
System.out.println("昵称不能为空");
return;
}
// 开始登陆
loginServer(socket, nickName);
// 开启发送的线程
new SendThread(socket).start();
// 开启接受的线程
new ReceiveThread(socket).start();
} catch (IOException e)
{
e.printStackTrace();
} } // 登录的方法
public static void loginServer(Socket socket, String nickName)
throws Exception
{
// 获取输出流
OutputStream outputStream = socket.getOutputStream();
//把昵称写入
outputStream.write(nickName.getBytes());
// 获取输入流
InputStream inputStream = socket.getInputStream();
//创建字节数组
byte[] bytes = new byte[1024];
//把读取的信息存入数组里
inputStream.read(bytes);
//把数组转化为字符串类型
String s = new String(bytes).trim();
//判断登录是否成功
if (s.equals("1"))
{
System.out.println("登录成功");
} else if (s.equals("0"))
{
System.out.println("昵称重复");
} else
{
System.out.println("服务器异常");
} }
}

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

  1. mysql/Java服务端对emoji的支持

    更改好后的字符集: 乱码 推荐大家看 深入MySQL字符集设置 ,区分检查client端.server端的编码:最简单暴力的方式,是在所有的环节都显式明确的指定相同的编码. 比如使用python的My ...

  2. 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创

    今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...

  3. java服务端微信小程序支付

    发布时间:2018-10-05   技术:springboot+maven   概述 java微信小程序demo支付只需配置支付一下参数即可运行 详细 代码下载:http://www.demodash ...

  4. mysql/Java服务端对emoji的支持 专题

    关于utf8不支持emoji是因为emoji是用4个字节存储的字符,而mysql的utf8只能存储1-3个字节的字符.那就存不了呗 需要更改的地方:(1)Mysql服务器client,mysql,my ...

  5. java服务端集成极光消息推送--详细开发步骤

    1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...

  6. 那些年,我们见过的 Java 服务端乱象

    导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.” 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多 ...

  7. Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)

    设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...

  8. 那些年,我们见过的 Java 服务端“问题”

    导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...

  9. 那些年,我们见过的Java服务端乱象

    导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...

随机推荐

  1. bettercap实现内网Dns欺骗

    目的 让内网的所有计算机浏览网页的时候, 出现我的钓鱼页面 准备 kali系统 Bettercap dns文件 通过ifconfig查看当前计算机的ip, 我这边为, 192.168.1.150 创建 ...

  2. 一篇文章带你快速入门createjs

    开始用createjs这个框架的时候,发现网上的相关教程还是挺少的,所以写一篇文章,方便日后查看.   createjs简介 官网:http://www.createjs.cc/ createjs中包 ...

  3. 使用ConfuserEx加密混淆程序以及如何脱壳反编译

    一,准备如下工具: ConfuserEx.UnConfuserEx.Fixer.ConfuserExStringDecryptor.ConfuserExSwitchKiller.de4dot.ILSp ...

  4. java web项目中 读取properties 路径的问题

    可以先获取项目的classPath String classPath = this.getClass().getResource("/").getPath();//获取classP ...

  5. redis可视化工具redisClient

    下载连接:百度网盘 直接解压就可以用了

  6. js代码风格之链式结构

    <div class="box"> <ul class="menu"> <li class="level1"& ...

  7. Ionic 常用组件解析

    Ionic 常用组件解析 $ionicModal(弹出窗口): //创建一个窗口 //此处注意目录的起始位置为app $ionicModal.fromTemplateUrl('app/security ...

  8. h5可预览 图片ajax上传 (补更),后台数据获取方法---php

    原理是 先获取,然后手动转移文件路径,不然会被服务器自动删除 demo如下: <?php header('content-Type:text/html;charset=utf-8'); $fil ...

  9. 4个小时实现一个HTML5音乐播放器

    技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 接下来就步入正题: 要做一个音乐 ...

  10. JavaWeb 后端 <四> 之 Cookie HttpSession 学习笔记

    一.会话管理概述 1.什么是会话? 好比一次通话.打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话. 有功能 可以  文件 新建会话 2.解决的问题是什么? ...