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服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...
随机推荐
- Azure 认知服务 (2) 计算机视觉API - 分析图像
<Windows Azure Platform 系列文章目录> 在上一节内容中,笔者介绍了微软认知服务的概览. 在本节中,笔者将详细介绍微软认知服务中的一种:计算机视觉 (Computer ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- [Linux] PHP程序员玩转Linux系列-腾讯云硬盘扩容挂载
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- 【Python3之面向对象进阶】
一.isinstance和issubclass 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj=Foo() p ...
- 当mysql遇上PHP
博客提纲 利用PHP连接mySQL数据库 两套接口:面向对象和面向过程 实现写改删查(CUBD)实例 通过prepare语句处理相同类型的不同SQL语句 通过bind_param()绑定参数,及相关注 ...
- Linux网络编程客户\服务器设计范式
1.前言 网络编程分为客户端和服务端,服务器通常分为迭代服务器和并发服务器.并发服务器可以根据多进程或多线程进行细分,给每个连接创建一个独立的进程或线程,或者预先分配好多个进程或线程等待连接的请求.今 ...
- 九度OJ:1002-Grading
时间限制:1 秒内存限制:32 兆特殊判题:否提交:24102解决:6126 题目描述: Grading hundreds of thousands of Graduate Entrance Exam ...
- 《JavaScript高级程序设计》笔记一
第一章 JavaScript简介 一.JavaScript的起源 JavaScript诞生于1995年.当时,它的主要作用是处理一些输入验证操作.之前的话,都是把表单数据发送到服务器端,然后再去判断有 ...
- Swift大写和小写字符串
您可以通过字符串的 uppercaseString 和 lowercaseString 属性来访问一个字符串的大写/小写版本. 复制纯文本新窗口 let normal = "Could yo ...
- java excel导出
下面是jsp代码: <li class="btns"><input id="btnExport" class="btn btn-pr ...