Java Socket线程的设计原理介绍

45 篇文章 0 订阅
21 篇文章 0 订阅

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"就可以列出在线人员表。




转载地址:http://developer.51cto.com/art/201003/190001.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值