设计原理:

服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。

{源码}

import java.io.*;

import java.net.*;

import java.util.*;

import java.lang.*;

public class Server extends ServerSocket

{

private static ArrayList User_List = new ArrayList();

private static ArrayList Threader = new ArrayList();

private static LinkedList Message_Array = new LinkedList();

private static int Thread_Counter = 0;

private static boolean isClear = true;

protected static final int SERVER_PORT = 10000;

protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true);

public Server() throws FileNotFoundException, IOException

{

super(SERVER_PORT);

new Broadcast();

//append connection log

Calendar now = Calendar.getInstance();

String str = "[" + now.getTime().toString() + "] Accepted a connection\015\012";

byte[] tmp = str.getBytes();

LOG_FILE.write(tmp);

try

{

while (true)

{

Socket socket = accept();

new CreateServerThread(socket);

}

}

finally

{

close();

}

}

public static void main(String[] args) throws IOException

{

new Server();

}

//--- Broadcast

class Broadcast extends Thread

{

public Broadcast()

{

start();

}

public void run()

{

while (true)

{

if (!isClear)

{

String tmp = (String)Message_Array.getFirst();

for (int i = 0; i < Threader.size(); i++)

{

CreateServerThread client = (CreateServerThread)Threader.get(i);

client.sendMessage(tmp);

}

Message_Array.removeFirst();

isClear = Message_Array.size() > 0 ? false : true;

}

}

}

}

//--- CreateServerThread

class CreateServerThread extends Thread

{

private Socket client;

private BufferedReader in;

private PrintWriter out;

private String Username;

public CreateServerThread(Socket s) throws IOException

{

client = s;

in = new BufferedReader(new InputStreamReader(client.getInputStream()));

out = new PrintWriter(client.getOutputStream(), true);

out.println("--- Welcome to this chatroom ---");

out.println("Input your nickname:");

start();

}

public void sendMessage(String msg)

{

out.println(msg);

}

public void run()

{

try

{

int flag = 0;

Thread_Counter++;

String line = in.readLine();

while (!line.equals("bye"))

{

if (line.equals("l"))

{

out.println(listOnlineUsers());

line = in.readLine();

continue;

}

if (flag++ == 0)

{

Username = line;

User_List.add(Username);

out.println(listOnlineUsers());

Threader.add(this);

pushMessage("[< " + Username + " come on in >]");

}

else

{

pushMessage("" + line);

}

line = in.readLine();

}

out.println("--- See you, bye! ---");

client.close();

}

catch (IOException e)

{}

finally

{

try

{

client.close();

}

catch (IOException e)

{}

Thread_Counter--;

Threader.remove(this);

User_List.remove(Username);

pushMessage("[< " + Username + " left>]");

}

}

private String listOnlineUsers()

{

String s ="-+- Online list -+-\015\012";

for (int i = 0; i < User_List.size(); i++)

{

s += "[" + User_List.get(i) + "]\015\012";

}

s += "-+---------------------+-";

return s;

}

private void pushMessage(String msg)

{

Message_Array.addLast(msg);

isClear = false;

}

}

}

这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。

java三步 网易_Java基础:三步学会Java Socket编程·网易学院·教程相关推荐

  1. java class文件 代码_java_基础——用代码编译.java文件+加载class文件

    java_基础--用代码编译.java文件+加载class文件 java_基础--用代码编译.java文件+加载class文件 [简单编译的流程] package com.zjm.www.test; ...

  2. java 随机句子_Java基础三(Scanner键盘输入、Random随机数、流程控制语句)

    1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scanner类 ...

  3. 三 java的基本数据类型_JAVA基础(三)--JAVA基本数据类型

    前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处应有掌声),如果你还没入门,或者正在台阶上踱 ...

  4. 三步教会您如何才能快速学会CNC数控编程

    大家都知道,现在的cnc数控编程可以说是一门炙手可热的技术.据大数据统计,目前国内cnc数控编程技术员的工资在8000-15000的幅度之间.好多人就是看到了这么高的待遇而选择学习这门技术.但是,如何 ...

  5. java random产生随机数_java的三种随机数生成方式,必掌握

    随机数的产生在一些代码中很常用,也是我们必须要掌握的.而java中产生随机数的方法主要有三种: 第一种:new Random() 第二种:Math.random() 第三种:currentTimeMi ...

  6. java源代码实例倒计时_Java倒计时三种实现方式代码实例

    写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...

  7. java线程安全例子_Java总结篇系列:Java多线程(三)

    本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...

  8. java package报错_Java基础知识总结 - 超详细篇(上)

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  9. java三大特性 继承_java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  10. java单引号转义_Java基础入门——Java语言基础(上)

    本篇我们开始进入Java的学习,首先在学习如何编写Java语言前要先了解Java程序的基本结构. 一.Java程序的基本结构 一个Java程序的基本结构大体可以分为包.类.main()主方法.标识符. ...

最新文章

  1. ue4 截图_UE4中创建赛博朋克中国城市
  2. [python爬虫] 爬取图片无法打开或已损坏的简单探讨
  3. 让我们来了解一下:操作系统和平台相关性
  4. IOS之学习笔记九(对象的初始化)
  5. sap中泰国有预扣税设置吗_泰国餐厅密度细分:带有K-means聚类的python
  6. HTML下拉菜单怎么做成横向,css导航条横向带下拉菜单
  7. 从容 IT 人生路,开发工具伴我行——“葡萄城 30 周年”征文
  8. 李大勇matlab视频解压密码,13.4 环境控制、手动开关模块
  9. 安装win10 无网络_微软已修复Win10“无网络连接”问题 已在Dev频道测试
  10. 翻译 - 【Dojo Tutorials】Getting Started with dojox/app
  11. xmarin.android导航栏,Xamarin.Forms中心标题和透明导航栏 - Android
  12. c# 使用NPOI按模板导出excel
  13. Arcface训练vgg2face数据集——数据制作
  14. telnet远程登录服务器端口,Telnet服务器远程登录过程
  15. OK6410内存及启动流程
  16. open-falcon短信报警
  17. ajax提交验证非空,5.验证用户名是否已经被注册:AJAXC请求
  18. vmware校园网虚拟机无法连接网络解决方法
  19. 前端面试:经典面试题Foo与getName()
  20. 微软与GitHub百人签名,力挺996.ICU项目

热门文章

  1. 【Spring】Spring boot的ApplicationContextAware 实现获取service
  2. 【Flink】Flink 多个 OutputTag 不能直接 union 的问题
  3. 95-160-024-源码-DataStream-ConnectedStreams与union合并流
  4. JVM :执行jinfo命令报错Can't attach symbolicator to the process
  5. flink 1.9.0 编译:flink-shaded-hadoop-2 找不到
  6. Mac下安装Flink的local模式(flink-1.5.2)
  7. 超给力,抛弃手动维护,一键生成数据库文档、支持多种格式!
  8. 还在用Swagger?我推荐这款零代码侵入的接口管理神器!
  9. java中this_JAVA中this用法小结
  10. Java并发编程-synchronized锁优化