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

import java.io.*;
import java.net.*;
import java.util.*;


/**
 *
 * @author Chen Yi <njchenyi@gmail.com>
 */
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  

import java.io.*;
import java.net.*;


/**
 *
 * @author Chen Yi <njchenyi@gmail.com>
 */
public 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套接字建立连接。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
// 文件名:moreServer.java import java.io.*; import java.net.*; import java.util.*; /** * <p>Title: 多线程服务器</p> * <p>Description: 本实例使用多线程实现多服务功能。</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Filename: </p> * @author 杜江 * @version 1.0 */ class moreServer { public static void main (String [] args) throws IOException { System.out.println ("Server starting...\n"); //使用8000端口提供服务 ServerSocket server = new ServerSocket (8000); while (true) { //阻塞,直到有客户连接 Socket sk = server.accept (); System.out.println ("Accepting Connection...\n"); //启动服务线程 new ServerThread (sk).start (); } } } //使用线程,为多个客户端服务 class ServerThread extends Thread { private Socket sk; ServerThread (Socket sk) { this.sk = sk; } //线程运行实体 public void run () { BufferedReader in = null; PrintWriter out = null; try{ InputStreamReader isr; isr = new InputStreamReader (sk.getInputStream ()); in = new BufferedReader (isr); out = new PrintWriter ( new BufferedWriter( new OutputStreamWriter( sk.getOutputStream ())), true); while(true){ //接收来自客户端的请求,根据不同的命令返回不同的信息。 String cmd = in.readLine (); System.out.println(cmd); if (cmd == null) break; cmd = cmd.toUpperCase (); if (cmd.startsWith ("BYE")){ out.println ("BYE"); break; }else{ out.println ("你好,我是服务器!"); } } }catch (IOException e) { System.out.println (e.toString ()); } finally { System.out.println ("Closing Connection...\n"); //最后释放资源 try{ if (in != null) in.close (); if (out != null) out.close (); if (sk != null) sk.close (); } catch (IOException e) { System.out.println("close err"+e); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值