java socket 通信,简易聊天功能,
参考:http://www.cnblogs.com/feijian/p/4461087.html
服务端:
package com.lw.socket.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; public class ChatServer extends ServerSocket { private static final int SERVER_PORT = 8000; private static final String KEY = "key"; private static boolean isPrint = false;// 是否输出消息标志 private static List<String> user_list = new ArrayList<>();// 登录用户集合 private static List<ServerClientThread> thread_list = new ArrayList<ServerClientThread>();// 服务器已启用线程集合 private static LinkedList<String> message_list = new LinkedList<String>();// 存放消息队列 /** * 创建服务端Socket,创建向客户端发送消息线程,监听客户端请求并处理 */ public ChatServer() throws IOException { super(SERVER_PORT);// 创建ServerSocket new PrintOutThread();// 创建向客户端发送消息线程 new ServerReadThread();// 创建向客户端发送消息线程(服务端输入数据推送到各客户端) try { while (true) {// 监听客户端请求,启个线程处理 Socket socket = accept(); new ServerClientThread(socket); } } catch (Exception e) { e.printStackTrace(); } finally { close(); } } /** * 监听是否有输出消息请求线程类,向客户端发送消息 */ class PrintOutThread extends Thread { public PrintOutThread() { start(); } @Override public void run() { while (true) { if (isPrint) {// 将缓存在队列中的消息按顺序发送到各客户端,并从队列中清除。 String message = message_list.getFirst(); for (ServerClientThread thread : thread_list) { thread.sendMessage(message); } message_list.removeFirst(); isPrint = message_list.size() > 0 ? true : false; } } } } /** * 服务器向各客户端发送数据的线程 */ class ServerReadThread extends Thread { public ServerReadThread() { start(); } @Override public void run() { BufferedReader br = null; try { while (true) { System.out.println("服务端发送数据输入:"); br = new BufferedReader(new InputStreamReader(System.in)); String send = br.readLine(); DateFormat dateTimeformat = new SimpleDateFormat("HH:mm:ss"); String date = dateTimeformat.format(new Date()); message_list.addLast(date + "【系统消息】:" + send); isPrint = true; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } } } /** * 服务器线程类 */ class ServerClientThread extends Thread { private Socket client; private PrintWriter writer; private BufferedReader reader; private String name; public ServerClientThread(Socket s) throws IOException { client = s; writer = new PrintWriter(client.getOutputStream(), true); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); String read = reader.readLine(); if(KEY.equals(read)) { writer.println("成功连上聊天室,请输入你的名字:"); start(); } } @Override public void run() { try { int flag = 0; String line = reader.readLine(); while (!"byeClient".equals(line)) { // 查看在线用户列表 if ("showuser".equals(line)) { writer.println(this.listOnlineUsers()); line = reader.readLine(); } // 第一次进入,保存名字 if (flag++ == 0) { name = line; user_list.add(name); thread_list.add(this); writer.println(name + "你好,可以开始聊天了..."); this.pushMessage("【" + name + "】进入聊天室..."); } else { this.pushMessage("【" + name + "】 say : " + line); } line = reader.readLine(); } writer.println("byeClient"); } catch (Exception e) { e.printStackTrace(); } finally {// 用户退出聊天室 try { client.close(); } catch (IOException e) { e.printStackTrace(); } thread_list.remove(this); user_list.remove(name); pushMessage("【" + name + "】退出了聊天室"); } } // 放入消息队列末尾,准备发送给客户端 private void pushMessage(String msg) { DateFormat dateTimeformat = new SimpleDateFormat("HH:mm:ss"); String date = dateTimeformat.format(new Date()); message_list.addLast(date + msg); isPrint = true; } // 向客户端发送一条消息 private void sendMessage(String msg) { writer.println(msg); } // 统计在线用户列表 private String listOnlineUsers() { String s = "--- 在线用户列表 ---\015\012"; for (int i = 0; i < user_list.size(); i++) { s += "[" + user_list.get(i) + "]\015\012"; } s += "--------------------"; return s; } } public static void main(String[] args) { try { new ChatServer().close();// 启动服务端 } catch (IOException e) { e.printStackTrace(); } } }
客户端:
package com.lw.socket.client; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ChatClient extends Socket { private static final String SERVER_IP = "127.0.0.1"; private static final int SERVER_PORT = 8000; private static final String PASSWORD = "pwd"; private static final String KEY = "key"; private Socket client; private PrintWriter writer; private BufferedReader reader; /** * 与服务器连接,并输入发送消息 */ public ChatClient() throws Exception { super(SERVER_IP, SERVER_PORT); client = this; writer = new PrintWriter(client.getOutputStream(), true); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); new readLineThread(); System.out.println("输入正确的密码连接服务器"); while(true) { BufferedReader readerIn = new BufferedReader(new InputStreamReader(System.in)); String input = readerIn.readLine(); if(PASSWORD.equals(input)) { writer.println(KEY); break; } else { System.out.println("输入错误,请重新输入!"); } } while (true) { reader = new BufferedReader(new InputStreamReader(System.in)); String input = reader.readLine(); writer.println(input); } } /** * 用于监听服务器端向客户端发送消息线程类 */ class readLineThread extends Thread { private BufferedReader buff; public readLineThread() { try { buff = new BufferedReader(new InputStreamReader(client.getInputStream())); start(); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { try { while (true) { String result = buff.readLine(); if ("byeClient".equals(result)) {// 客户端申请退出,服务端返回确认退出 break; } else {// 输出服务端发送消息 System.out.println(result); } } reader.close(); writer.close(); client.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { try { new ChatClient().close();// 启动客户端 } catch (Exception e) { e.printStackTrace(); } } }
相关推荐
tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl
tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl
基于java的ssm停车位短租系统程序答辩PPT.pptx
tornado-6.4b1-cp38-abi3-musllinux_1_1_x86_64.whl
基于java的招生管理系统答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
基于java的农机电招平台答辩PPT.pptx
jdk23 甲骨文官方安装包
基于java的机场网上订票系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
基于java的网上书店销售管理系统答辩PPT.pptx
tornado-6.3.3-cp38-abi3-win32.whl
【作品名称】:基于 Jsp+Sqlserver 实现的超市信息管理系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 系统功能: (1)系统分两种身份:管理员和员工,选择不同的身份进入不同的功能操作界面! (2)商品信息管理:管理员可以添加和维护商品信息,员工只能对商品信息进行查询 (3)员工信息管理:管理员登陆系统后可以可以添加和维护超市员工(收银员)的信息 (4)商品进货管理:管理员登陆系统后可以添加商品进货信息,可以对商品进货信息进行查询和统计,添加商品进进货退货信息,对商品进货退货信息进行查询和统计 (5)商品销售管理:员工(收银员)登陆系统后可以对商品进行销售,可以按时间查询自己的销售业绩;管理员登陆系统后可以按照时间等条件对销售信息进行查询,可以根据小票号登记顾客退货信息,查询顾客退货信息,可以查看员 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl
基于java的热带水果商城答辩PPT.pptx
java awt、Swing实现中国象棋可联机版本采用面向对象思想 采用面向对象的思路,实现中国象棋可联机版本,适合初学者,以及对面向对象有更深层次理解的开发者或者同学。 使用原生的java awt、Swing进行窗口式开发 将素材文件夹放在D:\Game路径下 两个工程直接导入Eclipse,即可运行, ps:一个工程运行两次也可以,需要注意端口号,代码默认如果连接的端口号是3003,则监听3004端口,相反同理。联机前需要确保两台计算机同时处于局域网或外网
web前端设计与开发(详细整理)(包含html讲解,css讲解,移动web讲解),合适学习前端的人员进行基础学习,一秒变高手
分析所需的数据和代码都在这里
Listening Exercise 3 Part 2.mp3
链表 删除链表中的重复元素,链表基础