`

用Java实现多线程服务器程序

 
阅读更多

Java是伴随Internet的大潮产生的,对网络及多线程具有内在的支持,具有网络时代编程语言的一切特点。从Java的当前应用看,Java主要用于在Internet或局域网上的网络编程,而且将Java作为主流的网络编程语言的趋势愈来愈明显。实际工作中,我们除了使用商品化的服务器软件外,时常需要按照实际环境编写自己的服务器软件,以完成特定任务或与特定客户端软件实现交互。在实现服务器程序时,为提高程序运行效率,降低用户等待时间,我们应用了在Java Applet中常见的多线程技术。 
 
  一、Java中的服务器程序与多线程 

  在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持。在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供了对网络支持的无平台相关性的完整软件包,使程序员没有必要为系统网络支持的细节而烦恼。 

  Java软件包内在支持的网络协议为TCP/IP,也是当今最流行的广域网/局域网协议。Java有关网络的类及接口定义在java.net包中。客户端软件通常使用java.net包中的核心类Socket与服务器的某个端口建立连接,而服务器程序不同于客户机,它需要初始化一个端口进行监听,遇到连接呼叫,才与相应的客户机建立连接。Java.net包的ServerSocket类包含了编写服务器系统所需的一切。下面给出ServerSocket类的部分定义。

 

public class ServerSocket
{
 public ServerSocket(int port)
 throws IOException ;
 public Socket accept() throws IOException ;
 public InetAddress getInetAddress() ;
 public int getLocalPort() ;
 public void close() throws IOException ;
 public synchronized void setSoTimeout (int timeout) throws SocketException ;
 public synchronized int getSoTimeout() throws IOException ;
}

 ServerSocket构造器是服务器程序运行的基础,它将参数port指定的端口初始化作为该服务器的端口,监听客户机连接请求。Port的范围是0到65536,但0到1023是标准Internet协议保留端口,而且在Unix主机上,这些端口只有root用户可以使用。一般自定义的端口号在8000到16000之间。仅初始化了ServerSocket还是远远不够的,它没有同客户机交互的套接字(Socket),因此需要调用该类的accept方法接受客户呼叫。Accept()方法直到有连接请求才返回通信套接字(Socket)的实例。通过这个实例的输入、输出流,服务器可以接收用户指令,并将相应结果回应客户机。ServerSocket类的getInetAddress和getLocalPort方法可得到该服务器的IP地址和端口。setSoTimeout和getSoTimeout方法分别是设置和得到服务器超时设置,如果服务器在timout设定时间内还未得到accept方法返回的套接字实例,则抛出IOException的异常。

 


  Java的多线程可谓是Java编程的精华之一,运用得当可以极大地改善程序的响应时间,提高程序的并行性。在服务器程序中,由于往往要接收不同客户机的同时请求或命令,因此可以对每个客户机的请求生成一个命令处理线程,同时对各用户的指令作出反应。在一些较复杂的系统中,我们还可以为每个数据库查询指令生成单独的线程,并行对数据库进行操作。实践证明,采用多线程设计可以很好的改善系统的响应,并保证用户指令执行的独立性。由于Java本身是"线程安全"的,因此有一条编程原则是能够独立在一个线程中完成的操作就应该开辟一个新的线程。 

  Java中实现线程的方式有两种,一是生成Thread类的子类,并定义该子类自己的run方法,线程的操作在方法run中实现。但我们定义的类一般是其他类的子类,而Java又不允许多重继承,因此第二种实现线程的方法是实现Runnable接口。通过覆盖Runnable接口中的run方法实现该线程的功能。本文例子采用第一种方法实现线程。 

  二、多线程服务器程序举例 

  以下是我们在项目中采用的多线程服务器程序的架构,可以在此基础上对命令进行扩充。本例未涉及数据库。如果在线程运行中需要根据用户指令对数据库进行更新操作,则应注意线程间的同步问题,使同一更新方法一次只能由一个线程调用。这里我们有两个类,receiveServer包含启动代码(main()),并初始化ServerSocket的实例,在accept方法返回用户请求后,将返回的套接字(Socket)交给生成的线程类serverThread的实例,直到该用户结束连接。

 

//类receiveServer
import java.io.*;
import java.util.*;
import java.net.*;
   
public class receiveServer{
 final int RECEIVE_PORT=9090; //该服务器的端口号
 //receiveServer的构造器public receiveServer() {ServerSocket rServer=null;
 //ServerSocket的实例
 Socket request=null;
 //用户请求的套接字Thread receiveThread=null;
 try{
  rServer=new ServerSocket(RECEIVE_PORT);
  //初始化ServerSocket System.out.println("Welcome to the server!");
  System.out.println(new Date());
  System.out.println("The server is ready!");
  System.out.println("Port: "+RECEIVE_PORT);
  while(true){ //等待用户请求 request=rServer.accept(); //接收客户机连接请求receiveThread=new serverThread(request);
   
  //生成serverThread的实例
  receiveThread.start();
   
  //启动serverThread线程
 }
}
catch(IOException e){
 System.out.println(e.getMessage()) ;
}
} public static void main(String args[]){ new receiveServer();
   
} //end of main} //end of class//类serverThreadimport java.io.*;
   
import java.net.*;
class serverThread extends Thread {Socket clientRequest;
//用户连接的通信套接字BufferedReader input;
//输入流PrintWriter output;
//输出流
public serverThread(Socket s) {
 //serverThread的构造器 this.clientRequest=s;
 //接收receiveServer传来的套接字 InputStreamReader reader;
   
 OutputStreamWriter writer;
 try{
  //初始化输入、输出流
  reader=new InputStreamReader(clientRequest.getInputStream());
  writer=new OutputStreamWriter(clientRequest.getOutputStream());
  input=new BufferedReader(reader);
  output=new PrintWriter(writer,true);
 }
 catch(IOException e){ System.out.println(e.getMessage());}
 output.println("Welcome to the server!");
 //客户机连接欢迎词
 output.println("Now is: "+new java.util.Date()+" "+ "Port:"+clientRequest.getLocalPort());
 output.println("What can I do for you?");
}
   
public void run(){
 //线程的执行方法
 String command=null;
 //用户指令 String str=null;
 boolean done=false;
 while(!done){
  try{
   str=input.readLine();
   //接收客户机指令
  }catch(IOException e){
   System.out.println(e.getMessage());
 }
 command=str.trim().toUpperCase();
   
 if(str==null || command.equals("QUIT")) //命令quit结束本次连接
  done=true;
 else if(command.equals("HELP")){
  //命令help查询本服务器可接受的命令
  output.println("query");
  output.println("quit");
  output.println("help");
 }
 else if(command.startsWith("QUERY")){
  //命令
  query output.println("OK to query something!");
 }//else if …….. //在此可加入服务器的其他指令
 else if(!command.startsWith("HELP") && !command.startsWith("QUIT") && !command.startsWith("QUERY")){output.println("Command not Found!
  Please refer to the HELP!"); }
}
   
//end of while
   
try
{
 clientRequest.close();
 //关闭套接字
}
catch(IOException e){
 System.out.println(e.getMessage());
}
command=null;
}
   
//end of run

 

 启动该服务器程序后,可用telnet machine port命令连接,其中machine为本机名或地址,port为程序中指定的端口。也可以编写特定的客户机软件通过TCP的Socket套接字建立连接。

http://www.dev26.com/bbs/topic/367web开发站

 

分享到:
评论

相关推荐

    java实现的多线程服务器

    综上所述,这个“java实现的多线程服务器”项目涵盖了Java多线程编程、网络编程、并发控制、异常处理和性能优化等多个重要知识点,对于学习和实践Java服务器开发具有很高的价值。通过深入研究和理解这个项目,开发者...

    java 多线程 socket聊天程序

    Java多线程Socket聊天程序是基于Java编程语言实现的一个网络通信应用,主要涉及了Java的Socket编程和多线程技术。这两个核心概念在Java中占据了非常重要的地位,特别是在开发网络应用和服务端系统时。 首先,Java ...

    基于tesseract的多线程OCR服务器的JAVA实现

    【标题】基于tesseract的多线程OCR服务器的JAVA实现 在信息技术领域,光学字符识别(OCR)技术被广泛应用于将图像中的文本转换为可编辑的电子格式。Tesseract是一款开源OCR引擎,由Google维护,它具有高精度和强大...

    Java多线程服务器编程

    简单的多线程服务器实现,东北大学网络实验之一

    程序设计-基于Java的多线程Web服务器

    "MultiThreadedWebServer.java"是Web服务器的核心,它使用多线程技术来处理并发的客户端请求。在Java中,多线程可以通过继承Thread类或实现Runnable接口来实现。通常,服务器会创建一个新的线程来处理每个新到来的...

    java多线程聊天程序

    Java多线程聊天程序是一种利用Java编程语言设计的实时通讯应用,它利用图形用户界面(GUI)提供交互式用户体验,并通过Socket进行网络通信。在这个程序中,多线程技术是核心,因为它允许并发处理,使得用户可以同时...

    java多线程服务器源码

    【Java多线程服务器源码】是针对初学者和入门者的一个经典实例,它展示了如何在Java中构建一个多线程的服务器程序。Java语言因为其内置的多线程支持和强大的网络编程能力,使得开发这样的程序变得更加简单和安全。 ...

    用java写的多线程聊天程序GUI界面socket实现

    本项目以"用java写的多线程聊天程序GUI界面socket实现"为主题,旨在展示如何通过Java实现一个基本的聊天应用程序。 首先,我们要理解Java的Socket编程。Socket是网络通信的基本单元,它提供了两台计算机之间的连接...

    Java 实例 - Socket 实现多线程服务器程序源代码+详细指导教程.zip

    本教程主要探讨如何使用Java的Socket类来构建一个多线程服务器程序,并提供了详细的源代码实例和指导教程。以下是对相关知识点的详细介绍: 1. **Socket基础**: - Socket是网络通信中的端点,它代表了应用程序...

    Java多线程的聊天室程序

    标题所涉及的知识点为“Java多线程的聊天室程序”,这一主题包含了对Java多线程编程、Socket编程、网络通信以及C/S架构模式的理解和应用。在实际开发中,需要掌握Java的基础知识,熟悉网络编程,了解多线程的原理和...

    一个用JAVA实现多线程下载的应用程序和源代码!

    1. **Java多线程**:Java提供了对多线程的强大支持,主要体现在`Thread`类和`Runnable`接口上。通过创建多个线程,可以同时执行多个任务,这对于下载这样的I/O密集型操作尤其有利。每个线程负责下载文件的一部分,...

    java写的多线程下载程序源码

    Java编写的多线程下载程序源码是一种利用Java语言特性实现高效大文件下载的技术。在这一程序中,主要涉及到了Java的多线程处理和网络编程两大核心知识点。 首先,让我们深入理解Java的多线程。Java提供了丰富的多...

    java多线程服务器

    一个进程可以创建多个线程,线程与线程间的通信方式比较容易。本设计主要是编写一个多线程的网络通信程序,不同的线程处理不同类型的消息,比如有专门处理TCP的线程、专门处理UDP消息的线程等。

    多线程Web服务器的设计与实现 (java实现)

    在Java中实现多线程Web服务器是一项常见的实践,因为Java提供了强大的多线程支持。 首先,我们来理解多线程的概念。在单线程环境中,程序执行是顺序的,一次只能做一件事。而多线程允许程序同时执行多个任务,每个...

    Java 客户端服务器程序 学习笔记

    4. **多线程**:在服务器端,为了处理多个客户端的并发连接,通常会使用多线程技术。每个客户端连接对应一个独立的线程,确保服务器可以同时处理多个请求。 5. **异常处理**:在客户端-服务器编程中,异常处理至关...

    java实现的多线程端口扫描程序

    在这个场景中,我们讨论的是一个基于Java实现的多线程端口扫描程序。端口扫描是网络安全和网络管理中的常见操作,用于发现远程主机上开放的服务和端口。这种程序可以帮助系统管理员检查网络的脆弱性,定位潜在的安全...

    基于多线程的web服务器java源码

    1. **Java多线程基础**:Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。在Web服务器源码中,通常会采用后者,因为这样可以避免单继承的限制,提高代码的可扩展性。 2. **Socket编程**:Web服务器...

    java实现多线程下载

    下面我们将深入探讨如何使用Java实现多线程下载。 1. **线程基础**: - 在Java中,`Thread`类是用于创建新线程的基础,通过继承`Thread`类或实现`Runnable`接口,可以创建一个执行特定任务的新线程。 - `start()`...

Global site tag (gtag.js) - Google Analytics