Java Socket线程的设计原理介绍
Java Socket线程我们经常会用到的技术,但是有很多程序员还是有不少的使用问题,下面我们就看看如何才能进行有关的代码编写,希望大家又说收获。网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。
下面看看如何开发一个可以实时传递消息的程序。
JavaSocket线程的设计原理:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
{源码}
- importjava.io.*;
- importjava.net.*;
- importjava.util.*;
- importjava.lang.*;
- publicclassServerextendsServerSocket
- {
- privatestaticArrayListUser_List=newArrayList();
- privatestaticArrayListThreader=newArrayList();
- privatestaticLinkedListMessage_Array=newLinkedList();
- privatestaticintThread_Counter=0;
- privatestaticbooleanisClear=true;
- protectedstaticfinalintSERVER_PORT=10000;
- protectedFileOutputStreamLOG_FILE=newFileOutputStream("d:/connect.log",true);
- publicServer()throwsFileNotFoundException,IOException
- {
- super(SERVER_PORT);
- newBroadcast();
- //appendconnectionlog
- Calendarnow=Calendar.getInstance();
- Stringstr="["+now.getTime().toString()+"]Acceptedaconnection1512";
- byte[]tmp=str.getBytes();
- LOG_FILE.write(tmp);
- try
- {
- while(true)
- {
- Socketsocket=accept();
- newCreateServerThread(socket);
- }
- }
- finally
- {
- close();
- }
- }
- publicstaticvoidmain(String[]args)throwsIOException
- {
- newServer();
- }
- //---Broadcast
- classBroadcastextendsThread
- {
- publicBroadcast()
- {
- start();
- }
- publicvoidrun()
- {
- while(true)
- {
- if(!isClear)
- {
- Stringtmp=(String)Message_Array.getFirst();
- for(inti=0;i<Threader.size();i++)
- {
- CreateServerThreadclient=(CreateServerThread)Threader.get(i);
- client.sendMessage(tmp);
- }
- Message_Array.removeFirst();
- isClear=Message_Array.size()>0?false:true;
- }
- }
- }
- }
- //---CreateServerThread
- classCreateServerThreadextendsThread
- {
- privateSocketclient;
- privateBufferedReaderin;
- privatePrintWriterout;
- privateStringUsername;
- publicCreateServerThread(Sockets)throwsIOException
- {
- client=s;
- in=newBufferedReader(newInputStreamReader(client.getInputStream()));
- out=newPrintWriter(client.getOutputStream(),true);
- out.println("---Welcometothischatroom---");
- out.println("Inputyournickname:");
- start();
- }
- publicvoidsendMessage(Stringmsg)
- {
- out.println(msg);
- }
- publicvoidrun()
- {
- try
- {
- intflag=0;
- Thread_Counter++;
- Stringline=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+"comeonin>]");
- }
- else
- {
- pushMessage("<"+Username+">"+line);
- }
- line=in.readLine();
- }
- out.println("---Seeyou,bye!---");
- client.close();
- }
- catch(IOExceptione)
- {}
- finally
- {
- try
- {
- client.close();
- }
- catch(IOExceptione)
- {}
- Thread_Counter--;
- Threader.remove(this);
- User_List.remove(Username);
- pushMessage("[<"+Username+"left>]");
- }
- }
- privateStringlistOnlineUsers()
- {
- Strings="-+-Onlinelist-+-1512";
- for(inti=0;i<User_List.size();i++)
- {
- s+="["+User_List.get(i)+"]1512";
- }
- s+="-+---------------------+-";
- returns;
- }
- privatevoidpushMessage(Stringmsg)
- {
- Message_Array.addLast(msg);
- isClear=false;
- }
- }
- }
以上就是对Java Socket线程的详细介绍。这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。