Java Socket线程的设计原理介绍
转自:http://developer.51cto.com/art/201003/190001.htm
Java Socket线程我们经常会用到的技术,但是有很多程序员还是有不少的使用问题,下面我们就看看如何才能进行有关的代码编写,希望大家又说收获。网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。
下面看看如何开发一个可以实时传递消息的程序。
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 connection1512";
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("<" + Username + ">" + 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 -+-1512";
for (int i = 0; i < User_List.size(); i++)
{
s += "[" + User_List.get(i) + "]1512";
}
s += "-+---------------------+-";
return s;
}
private void pushMessage(String msg)
{
Message_Array.addLast(msg);
isClear = false;
}
}
}
以上就是对Java Socket线程的详细介绍。这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。
Java Socket线程的设计原理介绍
Java Socket线程如何才能更好的使用相关的技术应用呢?下面我们就看看如何才能更好的使用。希望大家有所收获。
- 作者:佚名来源:博客园|2010-03-19 17:47
Java Socket线程我们经常会用到的技术,但是有很多程序员还是有不少的使用问题,下面我们就看看如何才能进行有关的代码编写,希望大家又说收获。网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。
下面看看如何开发一个可以实时传递消息的程序。
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 connection1512";
- 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("<" + Username + ">" + 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 -+-1512";
- for (int i = 0; i < User_List.size(); i++)
- {
- s += "[" + User_List.get(i) + "]1512";
- }
- s += "-+---------------------+-";
- return s;
- }
- private void pushMessage(String msg)
- {
- Message_Array.addLast(msg);
- isClear = false;
- }
- }
- }
以上就是对Java Socket线程的详细介绍。这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。
Java Socket线程的设计原理介绍的更多相关文章
- Java进阶——— 线程池的原理分析
前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...
- java socket线程通信
关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...
- Java - "JUC线程池" ThreadPoolExecutor原理解析
Java多线程系列--“JUC线程池”02之 线程池原理(一) ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存 ...
- java中的String设计原理
首先,必须强调一点:String Pool不是在堆区,也不是在栈区,而是存在于方法区(Method Area) 解析: String Pool是常量池(Constant Pool)中的一块. 我们知 ...
- 谈谈Java的线程池设计
在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了).这种情况下,最好是将任务提交给线程池执行. 所谓池,就是将管理某一种资源,对资源进行复 ...
- kafka设计原理介绍
背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...
- Java Socket编程如何建立两者关系
转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...
- Java线程池的原理及几类线程池的介绍
刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...
- Java[4] Jetty工作原理介绍(转)
转自:https://www.ibm.com/developerworks/cn/java/j-lo-jetty/ Jetty 的工作原理以及与 Tomcat 的比较 Jetty 应该是目前最活跃也是 ...
随机推荐
- 【优先级队列】 Holedox Eating
https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/M [Accepted] #include<iostream> #in ...
- leetcode之twosum
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector& ...
- 【bzoj4260】 Codechef REBXOR trie树
Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input ...
- SQL Prompt 5.1使用
SQL Prompt 5.1教程 1.下载 自行下载安装文件.本人是从http://www.cr173.com/下载的. 2.安装 安装没什么特别的,不用说了 3.注意一下破解和配置 按里面的read ...
- 「CodePlus 2018 3 月赛」白金元首与克劳德斯
所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...
- Codeforces 513G1 513G2 Inversions problem [概率dp]
转自九野:http://blog.csdn.net/qq574857122/article/details/43643135 题目链接:点击打开链接 题意: 给定n ,k 下面n个数表示有一个n的排列 ...
- Palindrome Partitioning (回文子串题)
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- R-Tree空间索引算法的研究历程和最新进展分析
转自原文 R-Tree空间索引算法的研究历程和最新进展分析,2008 摘要:本文介绍了空间索引的概念.R-Tree数据结构和R-Tree空间索引的算法描述,并从R-Tree索引技术的优缺点对R-Tre ...
- Fortinet网络接入及安全方案配置步骤
http://sec.chinabyte.com/200/12553700.shtml 1.概述: Fortinet无线接入及方案由以下两类设备组成: AC(Wifi接入控制器)及安全网关:Forti ...
- Redis 命令行 常用总结
http://www.redis.cn/commands.html# 1 Keys * 列出所有的keys redis > keys * ) "s:0" ) "o: ...