转自: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线程的设计原理:

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

{源码}

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4. import java.lang.*;
  5. public class Server extends ServerSocket
  6. {
  7. private static ArrayList User_List = new ArrayList();
  8. private static ArrayList Threader = new ArrayList();
  9. private static LinkedList Message_Array = new LinkedList();
  10. private static int Thread_Counter = 0;
  11. private static boolean isClear = true;
  12. protected static final int SERVER_PORT = 10000;
  13. protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true);
  14. public Server() throws FileNotFoundException, IOException
  15. {
  16. super(SERVER_PORT);
  17. new Broadcast();
  18. //append connection log
  19. Calendar now = Calendar.getInstance();
  20. String str = "[" + now.getTime().toString() + "] Accepted a connection1512";
  21. byte[] tmp = str.getBytes();
  22. LOG_FILE.write(tmp);
  23. try
  24. {
  25. while (true)
  26. {
  27. Socket socket = accept();
  28. new CreateServerThread(socket);
  29. }
  30. }
  31. finally
  32. {
  33. close();
  34. }
  35. }
  36. public static void main(String[] args) throws IOException
  37. {
  38. new Server();
  39. }
  40. //--- Broadcast
  41. class Broadcast extends Thread
  42. {
  43. public Broadcast()
  44. {
  45. start();
  46. }
  47. public void run()
  48. {
  49. while (true)
  50. {
  51. if (!isClear)
  52. {
  53. String tmp = (String)Message_Array.getFirst();
  54. for (int i = 0; i < Threader.size(); i++)
  55. {
  56. CreateServerThread client = (CreateServerThread)Threader.get(i);
  57. client.sendMessage(tmp);
  58. }
  59. Message_Array.removeFirst();
  60. isClear = Message_Array.size() > 0 ? false : true;
  61. }
  62. }
  63. }
  64. }
  65. //--- CreateServerThread
  66. class CreateServerThread extends Thread
  67. {
  68. private Socket client;
  69. private BufferedReader in;
  70. private PrintWriter out;
  71. private String Username;
  72. public CreateServerThread(Socket s) throws IOException
  73. {
  74. client = s;
  75. in = new BufferedReader(new InputStreamReader(client.getInputStream()));
  76. out = new PrintWriter(client.getOutputStream(), true);
  77. out.println("--- Welcome to this chatroom ---");
  78. out.println("Input your nickname:");
  79. start();
  80. }
  81. public void sendMessage(String msg)
  82. {
  83. out.println(msg);
  84. }
  85. public void run()
  86. {
  87. try
  88. {
  89. int flag = 0;
  90. Thread_Counter++;
  91. String line = in.readLine();
  92. while (!line.equals("bye"))
  93. {
  94. if (line.equals("l"))
  95. {
  96. out.println(listOnlineUsers());
  97. line = in.readLine();
  98. continue;
  99. }
  100. if (flag++ == 0)
  101. {
  102. Username = line;
  103. User_List.add(Username);
  104. out.println(listOnlineUsers());
  105. Threader.add(this);
  106. pushMessage("[< " + Username + " come on in >]");
  107. }
  108. else
  109. {
  110. pushMessage("<" + Username + ">" + line);
  111. }
  112. line = in.readLine();
  113. }
  114. out.println("--- See you, bye! ---");
  115. client.close();
  116. }
  117. catch (IOException e)
  118. {}
  119. finally
  120. {
  121. try
  122. {
  123. client.close();
  124. }
  125. catch (IOException e)
  126. {}
  127. Thread_Counter--;
  128. Threader.remove(this);
  129. User_List.remove(Username);
  130. pushMessage("[< " + Username + " left>]");
  131. }
  132. }
  133. private String listOnlineUsers()
  134. {
  135. String s ="-+- Online list -+-1512";
  136. for (int i = 0; i < User_List.size(); i++)
  137. {
  138. s += "[" + User_List.get(i) + "]1512";
  139. }
  140. s += "-+---------------------+-";
  141. return s;
  142. }
  143. private void pushMessage(String msg)
  144. {
  145. Message_Array.addLast(msg);
  146. isClear = false;
  147. }
  148. }
  149. }

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

Java Socket线程的设计原理介绍的更多相关文章

  1. Java进阶——— 线程池的原理分析

    前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...

  2. java socket线程通信

    关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...

  3. Java - "JUC线程池" ThreadPoolExecutor原理解析

    Java多线程系列--“JUC线程池”02之 线程池原理(一) ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存 ...

  4. java中的String设计原理

    首先,必须强调一点:String Pool不是在堆区,也不是在栈区,而是存在于方法区(Method Area) 解析: String Pool是常量池(Constant  Pool)中的一块. 我们知 ...

  5. 谈谈Java的线程池设计

    在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了).这种情况下,最好是将任务提交给线程池执行. 所谓池,就是将管理某一种资源,对资源进行复 ...

  6. kafka设计原理介绍

    背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...

  7. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  8. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  9. Java[4] Jetty工作原理介绍(转)

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-jetty/ Jetty 的工作原理以及与 Tomcat 的比较 Jetty 应该是目前最活跃也是 ...

随机推荐

  1. msp430项目编程21

    msp430中项目---直流电机控制系统 1.定时器工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  2. rabbitmq management Login Failed

    默认用户guest 只允许localhost登录. so... 我们自己建立用户 1. 用户管理 用户管理包括增加用户,删除用户,查看用户列表,修改用户密码. 相应的命令 (1) 新增一个用户 rab ...

  3. ASP.NET状态保持cookie与session

    ASP.Net状态保持 一.ASP.Net中的状态保持如下图:   二.客户端的状态保持方案     ViewState.隐藏域.Cookies.控件状态.URL查询参数      ->View ...

  4. HDU 5665 Lucky

    看有没有0和1,都有的时候是YES,否则是NO #include<cstdio> #include<cstring> #include<cmath> #includ ...

  5. POJ 2337 【字典序】【欧拉回路】

    题意: 给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排. 如果有多组解,输出字典序最小的一组解. 这题... WA了两天. 错误有以下: 1.没有初始化好起始位置,默认起始位置是a了 ...

  6. Linux下异常信号

    我们介绍一些标准信号的名称以及它们代表的事件.每一个信号名称是一个代表正整数的宏,但是你不要试图去推测宏代表的具体数值,而是直接使用名称.这是因为这个数值会随不同的系统或同样系统的不同版本而不同,但是 ...

  7. 在访问RESTful接口时出现:Could not write content: No serializer found for class的问题解决小技巧收集

    注意:市面上对于写RESTful是用RestFul,其实是不规范的,标准写法RESTful. 在Java上,处理这个应该是没有继承Serializable类,然后通过Eclipse生成serialVe ...

  8. Spring中实现自定义事件

    原理: 通过扩展ApplicationEvent,创建一个事件类CustomEvent.这个类必须定义一个默认的构造函数,它应该从ApplicationEvent类中继承的构造函数. 一旦定义事件类, ...

  9. Maven安装和手动安装jar到仓库

    1. 安装Maven 1.下载mvn到本地,解压. 2.新建系统变量MAVEN_HOME,值指向安装目录如D:\apache-maven-3.3.9 3.path变量中增加:%MAVEN_HOME%\ ...

  10. TUN/TAP区别

    在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备.不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能. TA ...