java三步 网易_Java基础:三步学会Java Socket编程·网易学院·教程
设计原理:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
{源码}
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编程·网易学院·教程相关推荐
- java class文件 代码_java_基础——用代码编译.java文件+加载class文件
java_基础--用代码编译.java文件+加载class文件 java_基础--用代码编译.java文件+加载class文件 [简单编译的流程] package com.zjm.www.test; ...
- java 随机句子_Java基础三(Scanner键盘输入、Random随机数、流程控制语句)
1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scanner类 ...
- 三 java的基本数据类型_JAVA基础(三)--JAVA基本数据类型
前两篇已经将开发环境搭建完成,如果你已经按之前的教程按部就班的完成了部署,那么世界上最优秀的编程语言之一和世界上最优秀的IDE之一已经出现在你的电脑上(此处应有掌声),如果你还没入门,或者正在台阶上踱 ...
- 三步教会您如何才能快速学会CNC数控编程
大家都知道,现在的cnc数控编程可以说是一门炙手可热的技术.据大数据统计,目前国内cnc数控编程技术员的工资在8000-15000的幅度之间.好多人就是看到了这么高的待遇而选择学习这门技术.但是,如何 ...
- java random产生随机数_java的三种随机数生成方式,必掌握
随机数的产生在一些代码中很常用,也是我们必须要掌握的.而java中产生随机数的方法主要有三种: 第一种:new Random() 第二种:Math.random() 第三种:currentTimeMi ...
- java源代码实例倒计时_Java倒计时三种实现方式代码实例
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- java线程安全例子_Java总结篇系列:Java多线程(三)
本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...
- java package报错_Java基础知识总结 - 超详细篇(上)
1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...
- java三大特性 继承_java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java单引号转义_Java基础入门——Java语言基础(上)
本篇我们开始进入Java的学习,首先在学习如何编写Java语言前要先了解Java程序的基本结构. 一.Java程序的基本结构 一个Java程序的基本结构大体可以分为包.类.main()主方法.标识符. ...
最新文章
- ue4 截图_UE4中创建赛博朋克中国城市
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
- 让我们来了解一下:操作系统和平台相关性
- IOS之学习笔记九(对象的初始化)
- sap中泰国有预扣税设置吗_泰国餐厅密度细分:带有K-means聚类的python
- HTML下拉菜单怎么做成横向,css导航条横向带下拉菜单
- 从容 IT 人生路,开发工具伴我行——“葡萄城 30 周年”征文
- 李大勇matlab视频解压密码,13.4 环境控制、手动开关模块
- 安装win10 无网络_微软已修复Win10“无网络连接”问题 已在Dev频道测试
- 翻译 - 【Dojo Tutorials】Getting Started with dojox/app
- xmarin.android导航栏,Xamarin.Forms中心标题和透明导航栏 - Android
- c# 使用NPOI按模板导出excel
- Arcface训练vgg2face数据集——数据制作
- telnet远程登录服务器端口,Telnet服务器远程登录过程
- OK6410内存及启动流程
- open-falcon短信报警
- ajax提交验证非空,5.验证用户名是否已经被注册:AJAXC请求
- vmware校园网虚拟机无法连接网络解决方法
- 前端面试:经典面试题Foo与getName()
- 微软与GitHub百人签名,力挺996.ICU项目
热门文章
- 【Spring】Spring boot的ApplicationContextAware 实现获取service
- 【Flink】Flink 多个 OutputTag 不能直接 union 的问题
- 95-160-024-源码-DataStream-ConnectedStreams与union合并流
- JVM :执行jinfo命令报错Can't attach symbolicator to the process
- flink 1.9.0 编译:flink-shaded-hadoop-2 找不到
- Mac下安装Flink的local模式(flink-1.5.2)
- 超给力,抛弃手动维护,一键生成数据库文档、支持多种格式!
- 还在用Swagger?我推荐这款零代码侵入的接口管理神器!
- java中this_JAVA中this用法小结
- Java并发编程-synchronized锁优化