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服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...
随机推荐
- Java字符串进阶
Java字符串进阶 前言 最常用的对字符串操作的类有三个,分别是String,StringBuilder,StringBuffer,下面将会详细的说说这三个类...... String String类 ...
- css3动画小案例
今天与大家来分享一下我做的css3动画案例. 在展示我的案例之前先给大家说说实现这个案例所需要的一些属性. transform 属性允许我们对元素进行旋转.缩放.移动或倾斜. 通过 CSS3 2D转换 ...
- 教你轻轻松松入门PHP
入门PHP不用愁,跟我来学一学. 1.我们想学习PHP,首先就要了解PHP,那PHP是什么呢? PHP("PHP: Hypertext Preprocessor",超文本预处理器的 ...
- 盒子模型,定位技术,负边距,html5 新增标签
盒子模型 /*[margin 外边距] margin属性最多四个 1.只写一个值,四个方向的margin均为这个值 2.写两个值:上,右两个方向,下默认=上,右 默认=左 3.写三个值:上.右.下三个 ...
- html中p标签行间距的问题
使用CSS行高样式line-height可以设置调整p行间距,但是同时会影响每行文字间的上下间距,所以使用line-height虽然可以用来设置html p 行距离间隔,但是不是很实用,一般line- ...
- js返回顶部封装 简洁
js返回顶部封装 简洁: 加入html页面body最后面即可. <script> a(); function a() { $(function() { if ($(".j-to- ...
- java高并发锁的3种实现
初级技巧 - 乐观锁 乐观锁适合这样的场景:读不会冲突,写会冲突.同时读的频率远大于写. 以下面的代码为例,悲观锁的实现: Java代码 public Object get(Object key) ...
- windows下pycharm远程调试pyspark
参考http://www.mamicode.com/info-detail-1523356.html1.远端执行:vi /etc/profile添加一行:PYTHONPATH=$SPARK_HOME/ ...
- php5.6在yum下安装gd库
yum install php-gd --enablerepo=remi,remi-php56 php.ini配置文件中增加 extension=gd.so 重启web服务器即可
- PHP按值合并数组
/** * PHP按值合并数组 * */ function my_array_merge(&$array1, &$array2) { $result = Array(); foreac ...