Java中实现多线程Server

首先,我们来看一下单线程的Server如何实现。

指定要监听的端口号,并创建一个ServerSocket对象。当通过accept()方法接受请求后,会返回一个Socket对象。之后我们通过这个这个Socket对象即可与请求方进行通信。这里我们使用了ObjectOutputStream和ObjectInputStream对象实现输入输出流,好处是可以通过序列化传输任何对象。当然,你也可以使用其他输入输出流对象。最后,不要忘记关闭输入输出流和Socket。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import

java.io.IOException;

import

java.io.ObjectInputStream;

import

java.io.ObjectOutputStream;

import

java.net.ServerSocket;

import

java.net.Socket;

public

class

Server{

    public

static

void

main(String[] args)
throws

IOException, ClassNotFoundException {

        

        int

listeningPort =
14837;

        ServerSocket
serverSocket =
new

ServerSocket(listeningPort);   

        Socket
clientSocket = serverSocket.accept();

        

        ObjectOutputStream
objOut =
new

ObjectOutputStream(clientSocket.getOutputStream());

        ObjectInputStream
objIn =
new

ObjectInputStream(clientSocket.getInputStream());

        

        //
Write your handler here

        

        objIn.close();

        objOut.close();

        clientSocket.close();

        serverSocket.close();

    }

}

接下来我们要在此基础上,将其扩展为多线程版本。

我们知道,如果想让一段代码多线程运行,只需新建一个类继承Thread。复写run()方法,把要执行的代码放在该方法内即可。

一个Socket对象就可以确立Server和请求方之间的链接,之后我们只需将clientSocket作为参数传入线程的构造方法即可。之后的处理全部在线程内部实现。代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import

java.net.*;

import

java.io.*;

public

class

DefaultSocketServer
extends

Thread {

        

    private

Socket clientSocket;

    private

ObjectInputStream objIn;

    private

ObjectOutputStream objOut;

    public

DefaultSocketServer(Socket clientSocket){

        this.clientSocket
= clientSocket;

    }

    public

void

run(){

        if

(openConnection()){

            try

{

                handleSession();

                closeSession();

            }
catch

(ClassNotFoundException | IOException e) {

                e.printStackTrace();

            }          

        }

    }

    

    private

boolean

openConnection(){

        try

{          

            objOut
=
new

ObjectOutputStream(clientSocket.getOutputStream());

            objIn
=
new

ObjectInputStream(clientSocket.getInputStream());          

        }
catch

(Exception e){

            System.err.println("Unable
to obtain stream."
);

            return

false
;

        }

        return

true
;

    }

    private

void

handleSession()
throws

IOException, ClassNotFoundException{

        //
Write your handler here

    }

    

    private

void

closeSession()
throws

IOException{

        objIn.close();

        objOut.close();

        clientSocket.close();

    }

}

最后修改Server类。每次accept一个新的请求,就new一个新的线程,将clientSocket作为参数传入。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import

java.io.IOException;

import

java.net.ServerSocket;

import

java.net.Socket;

public

class

Server{

    public

static

void

main(String[] args)
throws

IOException, ClassNotFoundException {

        

        int

listeningPort =
14837;

        ServerSocket
serverSocket =
null;

        serverSocket
=
new

ServerSocket(listeningPort);

        

        while

(
true)

            Socket
clientSocket = serverSocket.accept();

            DefaultSocketServer
defaultSocketServer =
new

DefaultSocketServer(clientSocket);

            defaultSocketServer.start();             

        }

    }

}

注:原文转自我的博客《Java中将Socket与Thread结合实现多线程服务器

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 02:45:26

Java中实现多线程Server的相关文章

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我

为什么Java中实现多线程的方式有两种?

在面试的过程中,我们经常问被面试者,为什么Java中实现多线程的方式有两种(一种是直接继承Thread类,一种是实现Runnable接口)?可惜的是,很多面试者都答不出来,甚至从来没有想为什么.,那么真正的原因是什么呢?我们可以用反证法推理一下: 假设Java只提供Thread供大家继承从而实现多线程,考虑下面的一个需求,如果有一个已经继承了某个父类的类,但是这个类又想实现多线程,怎么办?很显然,如果只提供一个可以继承的类,肯定解决不了这个问题.那么,如何解决,毫无疑问,就只能使用接口了.

Java中使用多线程、curl及代理IP模拟post提交和get访问

Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! [java] view plaincopyprint? /** * @组件名:javaDemo * @包名:javaDemo * @文件名:Jenny.java * @创建时间: 2014年8月1日 下午5:53:48 * @版权信息:Copyright ? 2014 eelly Co.Ltd,小姨子版权所有. */ package javaDemo; impo

Java中的 多线程编程

Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另

Java中的多线程=你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

Java中使用多线程、curl及代理IP模拟post提交和get訪问

Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~~~ 切割线扭起来 ~~~~~~ /** * @组件名:javaDemo * @包名:javaDemo * @文件名称:Jenny.java * @创建时间: 2014年8月1日 下午5:53:48 * @版权信息:Copyright ? 2014 eelly Co.Ltd,小姨子版权全部. */

黑马程序员【Java中的多线程】

Java中的多线程 首先,在开篇讲线程之前要说一个问题,我们知道多线程的执行原理是cpu在不同的线程中做着切换操作,而一提到多线程,大家首先想到的肯定是提高系统的运行效率,可是真的是这样的么?我们来借助一位大神博客中的代码就可以看出来有时单线程的运行效率要高于多线程: import threading from time import ctime class MyThread(threading.Thread): def __init__(self, func, args, name): thr

java中实现多线程的两种基本方法

java中实现多线程有两种基本方法,一种是继承Thread, 另一种是实现Runnable接口. 但是因为java中子类只能继承一个父类,如果采用继承Thread类,就不能继承其他类,很受限制. 以下是采用继承Thread类的例子: public class MyThreadTest{ public static void main(String[] args){ MyThread amythread1=new MyThread("my thread 1"); MyThread amy

java 中的多线程

java中实现多线程的方式有两种: 1.实现继承Thread 类的类(重写run方法) 2.实现Runnable 接口(重写run方法) 上述两种方式的关系; 看过jdk你会发现 Thread类是实现了 runnable的接口了的   可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势: (1). 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想. (2). 可以避免由于Java的单继承特性带