java服务端和用户端
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服务端和用户端的更多相关文章
- mysql/Java服务端对emoji的支持
更改好后的字符集: 乱码 推荐大家看 深入MySQL字符集设置 ,区分检查client端.server端的编码:最简单暴力的方式,是在所有的环节都显式明确的指定相同的编码. 比如使用python的My ...
- 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创
今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...
- java服务端微信小程序支付
发布时间:2018-10-05 技术:springboot+maven 概述 java微信小程序demo支付只需配置支付一下参数即可运行 详细 代码下载:http://www.demodash ...
- mysql/Java服务端对emoji的支持 专题
关于utf8不支持emoji是因为emoji是用4个字节存储的字符,而mysql的utf8只能存储1-3个字节的字符.那就存不了呗 需要更改的地方:(1)Mysql服务器client,mysql,my ...
- java服务端集成极光消息推送--详细开发步骤
1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...
- 那些年,我们见过的 Java 服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.” 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多 ...
- Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...
- 那些年,我们见过的 Java 服务端“问题”
导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...
- 那些年,我们见过的Java服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...
随机推荐
- Vue的报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'
Vue的报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>' ...
- 通过LOGBACK实现每个类、包或自定义级别
项实现LOGBACK对每个包或者类或者通过自定义级别的方式实现自定义输出的日志进入制定的文件.查阅了很多资料,都没有找到行之有效的解决方案,直到看到了这篇文章http://www.360doc.com ...
- 流畅的python学习笔记:第二章
第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...
- H5 web 存储之 Webstorage
H5提供了两种在客户端存储数据的方式:localStorage 持久化的本地存储(浏览器关闭重新打开数据依然存在)sessionStorage 针对一个session的本地存储之前这些都是由cooki ...
- Linux命令 文件压缩及压缩命令
gzip [功能说明] 文件的压缩 #gizp属于GNU软件,总性能不错,是Linux系统首选的压缩工具,tar归档命令的-z参数也是利用gzip/gunzip来解压缩 [语法格式] Gip[选项][ ...
- java web数据库(SQL 2008+IDEA 14)环境配置
废话少说,在之前已经配置过IDEA+Tomcat的环境之后,现在需要进行数据库配置: 1.首先,SQL SERVER2008数据库的安装 (1)将下载的sqlserver 2008数据库进行解压,点击 ...
- js模版引擎开发实战以及对eval函数的改进
简介 前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用,同时也算是之前学习的知识的一种总结吧! 首先我们先了解一下模版引擎的工作原理吧! 1. 模版引擎其实就是将指定标签的内容根 ...
- jmeter3.2版本完美实现Load Test报表
今天下载了最新版的apache tomcat jmeter 3.2,需要jdk1.8以上的版本. 用非GUI模式运行压力测试后,出现的报表太完美了. 将jmx脚本放在就jmeter_home下的Scr ...
- 《JavaScript高级程序设计》笔记一
第一章 JavaScript简介 一.JavaScript的起源 JavaScript诞生于1995年.当时,它的主要作用是处理一些输入验证操作.之前的话,都是把表单数据发送到服务器端,然后再去判断有 ...
- RDLC报表纵向合并单元格。
在做RDLC报表时发现居然没有纵向合并单元格,震惊! 网上查了一些资料,有些方法很可爱,采用去除边框法,但是用这种方法如果要求文本属性居中的话那则达不到美观效果,还有些复杂一点的方法,我都没耐心看,然 ...