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. [0] C#实现WebBrowser&HTML交互

    using System;using System.ComponentModel;using System.Windows.Forms; namespace WindowsApplication5{ ...

  2. 在项目中利用TX Text Control进行WORD文档的编辑显示处理

    在很多文档管理的功能模块里面,我们往往需要对WORD稳定进行展示.编辑等处理,而如果使用微软word控件进行处理,需要安装WORD组件,而且接口使用也不见得简单易用,因此如果有第三方且不用安装Offi ...

  3. Behavior的使用(一):页面跳转NavigateToPageAction

    Behavior的使用,让UI设计师能够更加方便的进行UI设计,更高效地和开发进行合作.Behavior有三种触发方式:EventTriggerBehavior事件触发,DataTriggerBeha ...

  4. 盒子模型,定位技术,负边距,html5 新增标签

    盒子模型 /*[margin 外边距] margin属性最多四个 1.只写一个值,四个方向的margin均为这个值 2.写两个值:上,右两个方向,下默认=上,右 默认=左 3.写三个值:上.右.下三个 ...

  5. Java学习笔记--脚本语言支持API

    Java语言的动态性之脚本语言支持API 随着Java平台的流行,很多的脚本语言(scripting language)都可以运行在Java虚拟机啊上,其中比较流行的有JavaScript.JRuby ...

  6. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用

    第4课  CC2530的定时/计数器原理与应用 广东职业技术学院  欧浩源 一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提 ...

  7. Haoop MapReduce 的Partition和reduce端的二次排序

    先贴一张原理图(摘自hadoop权威指南第三版) 实际中看了半天还是不太理解其中的Partition,和reduce端的二次排序,最终根据实验来结果来验证自己的理解 1eg 数据如下 20140101 ...

  8. linux下修改Apache配置文件

    linux下修改host文件host文件存放路径 /etc/hosts 可以用vim编辑 //Apache配置虚拟主机 /usr/local/apache/conf/extra/httpd-vhost ...

  9. 【Android Developers Training】 108. 使用模拟定位进行测试

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  10. ASP.NET Core Web 资源打包与压缩

    本文将介绍使用的打包和压缩的优点,以及如何在ASP.NET Core应用程序中使用这些功能. 概述 在ASP.Net中可以使用打包与压缩这两种技术来提高Web应用程序页面加载的性能.通过减少从服务器请 ...