虽能告诉我服务器端最简单的java程序?

虽能告诉我服务器端最简单的java程序?,第1张

15.3 服务多个客户

JabberServer可以正常工作,但每次只能为一个客户程序提供服务。在典型的服务器中,我们希望同时能处理多个客户的请求。解决这个问题的关键就是多线程处理机制。而对于那些本身不支持多线程的语言,达到这个要求无疑是异常困难的。通过第14章的学习,大家已经知道Java已对多线程的处理进行了尽可能的简化。由于Java的线程处理方式非常直接,所以让服务器控制多名客户并不是件难事。

最基本的方法是在服务器(程序)里创建单个ServerSocket,并调用accept()来等候一个新连接。一旦accept()返回,我们就取得结果获得的Socket,并用它新建一个线程,令其只为那个特定的客户服务。然后再调用accept(),等候下一次新的连接请求。

对于下面这段服务器代码,大家可发现它与JabberServer.java例子非常相似,只是为一个特定的客户提供服务的所有操作都已移入一个独立的线程类中:

//: MultiJabberServer.java

// A server that uses multithreading to handle

// any number of clients.

import java.io.*

import java.net.*

class ServeOneJabber extends Thread {

private Socket socket

private BufferedReader in

private PrintWriter out

public ServeOneJabber(Socket s)

throws IOException {

socket = s

in =

new BufferedReader(

new InputStreamReader(

socket.getInputStream()))

// Enable auto-flush:

out =

new PrintWriter(

new BufferedWriter(

new OutputStreamWriter(

socket.getOutputStream())), true)

// If any of the above calls throw an

// exception, the caller is responsible for

// closing the socket. Otherwise the thread

// will close it.

start()// Calls run()

}

public void run() {

try {

while (true) {

String str = in.readLine()

if (str.equals("END")) break

System.out.println("Echoing: " + str)

out.println(str)

}

System.out.println("closing...")

} catch (IOException e) {

} finally {

try {

socket.close()

} catch(IOException e) {}

}

}

}

public class MultiJabberServer {

static final int PORT = 8080

public static void main(String[] args)

throws IOException {

ServerSocket s = new ServerSocket(PORT)

System.out.println("Server Started")

try {

while(true) {

// Blocks until a connection occurs:

Socket socket = s.accept()

try {

new ServeOneJabber(socket)

} catch(IOException e) {

// If it fails, close the socket,

// otherwise the thread will close it:

socket.close()

}

}

} finally {

s.close()

}

}

} ///:~

每次有新客户请求建立一个连接时,ServeOneJabber线程都会取得由accept()在main()中生成的Socket对象。然后和往常一样,它创建一个BufferedReader,并用Socket自动刷新PrintWriter对象。最后,它调用Thread的特殊方法start(),令其进行线程的初始化,然后调用run()。这里采取的操作与前例是一样的:从套扫字读入某些东西,然后把它原样反馈回去,直到遇到一个特殊的"END"结束标志为止。

同样地,套接字的清除必须进行谨慎的设计。就目前这种情况来说,套接字是在ServeOneJabber外部创建的,所以清除工作可以“共享”。若ServeOneJabber构建器失败,那么只需向调用者“掷”出一个违例即可,然后由调用者负责线程的清除。但假如构建器成功,那么必须由ServeOneJabber对象负责线程的清除,这是在它的run()里进行的。

请注意MultiJabberServer有多么简单。和以前一样,我们创建一个ServerSocket,并调用accept()允许一个新连接的建立。但这一次,accept()的返回值(一个套接字)将传递给用于ServeOneJabber的构建器,由它创建一个新线程,并对那个连接进行控制。连接中断后,线程便可简单地消失。

如果ServerSocket创建失败,则再一次通过main()掷出违例。如果成功,则位于外层的try-finally代码块可以担保正确的清除。位于内层的try-catch块只负责防范ServeOneJabber构建器的失败;若构建器成功,则ServeOneJabber线程会将对应的套接字关掉。

为了证实服务器代码确实能为多名客户提供服务,下面这个程序将创建许多客户(使用线程),并同相同的服务器建立连接。每个线程的“存在时间”都是有限的。一旦到期,就留出空间以便创建一个新线程。允许创建的线程的最大数量是由final int maxthreads决定的。大家会注意到这个值非常关键,因为假如把它设得很大,线程便有可能耗尽资源,并产生不可预知的程序错误。

//: MultiJabberClient.java

// Client that tests the MultiJabberServer

// by starting up multiple clients.

import java.net.*

import java.io.*

class JabberClientThread extends Thread {

private Socket socket

private BufferedReader in

private PrintWriter out

private static int counter = 0

private int id = counter++

private static int threadcount = 0

public static int threadCount() {

return threadcount

}

public JabberClientThread(InetAddress addr) {

System.out.println("Making client " + id)

threadcount++

try {

socket =

new Socket(addr, MultiJabberServer.PORT)

} catch(IOException e) {

// If the creation of the socket fails,

// nothing needs to be cleaned up.

}

try {

in =

new BufferedReader(

new InputStreamReader(

socket.getInputStream()))

// Enable auto-flush:

out =

new PrintWriter(

new BufferedWriter(

new OutputStreamWriter(

socket.getOutputStream())), true)

start()

} catch(IOException e) {

// The socket should be closed on any

// failures other than the socket

// constructor:

try {

socket.close()

} catch(IOException e2) {}

}

// Otherwise the socket will be closed by

// the run() method of the thread.

}

public void run() {

try {

for(int i = 0i <25i++) {

out.println("Client " + id + ": " + i)

String str = in.readLine()

System.out.println(str)

}

out.println("END")

} catch(IOException e) {

} finally {

// Always close it:

try {

socket.close()

} catch(IOException e) {}

threadcount--// Ending this thread

}

}

}

public class MultiJabberClient {

static final int MAX_THREADS = 40

public static void main(String[] args)

throws IOException, InterruptedException {

InetAddress addr =

InetAddress.getByName(null)

while(true) {

if(JabberClientThread.threadCount()

<MAX_THREADS)

new JabberClientThread(addr)

Thread.currentThread().sleep(100)

}

}

} ///:~

JabberClientThread构建器获取一个InetAddress,并用它打开一个套接字。大家可能已看出了这样的一个套路:Socket肯定用于创建某种Reader以及/或者Writer(或者InputStream和/或OutputStream)对象,这是运用Socket的唯一方式(当然,我们可考虑编写一、两个类,令其自动完成这些操作,避免大量重复的代码编写工作)。同样地,start()执行线程的初始化,并调用run()。在这里,消息发送给服务器,而来自服务器的信息则在屏幕上回显出来。然而,线程的“存在时间”是有限的,最终都会结束。注意在套接字创建好以后,但在构建器完成之前,假若构建器失败,套接字会被清除。否则,为套接字调用close()的责任便落到了run()方法的头上。

threadcount跟踪计算目前存在的JabberClientThread对象的数量。它将作为构建器的一部分增值,并在run()退出时减值(run()退出意味着线程中止)。在MultiJabberClient.main()中,大家可以看到线程的数量会得到检查。若数量太多,则多余的暂时不创建。方法随后进入“休眠”状态。这样一来,一旦部分线程最后被中止,多作的那些线程就可以创建了。大家可试验一下逐渐增大MAX_THREADS,看看对于你使用的系统来说,建立多少线程(连接)才会使您的系统资源降低到危险程度。

如何把本地电脑做成服务器

由于现在宽带速度已经很快,电脑配置也越来越高,所以可以把自用PC电脑作为互联网网站服务器,首先需要分清宽带IP和本机IP是有区别的,演示的192.168.1.134是本机IP,另外一个地址是宽带IP地址。步骤如下:

1、首先本地电脑要搭建好内网能访问的服务器,本地电脑搭建网站的教程很多,本步骤省略,用本地IP能访问的的服务器,在地址栏中输入本机IP地址192.168.1.134访问自己的电脑网站;

2、如何让外网能访问,打开路由器设定;

3、进入转发规则-虚拟服务器-添加新条目;

4、如图输入,根据自己的本机IP进行输入,保存;

5、现在用固定宽带IP已经能外网访问了;

6、本地电脑的宽带IP地址,可以百度查询;

7、如何通过本地的域名也能外网访问呢,进去域名管理后台,将域名解析A记录指向本地的宽带IP地址;

8、现在,地址栏输入本地的域名可以访问了;

如何在自己的电脑上搭建服务器环境?

你要是测试php的话,就不能安装iis,因为你要测试php,需要安装apache服务器,iis和apache服务器都是提供的一种功能,都占用80端口,顶以只能安装一个!

WAMP5和xampp 都是windows下面架设php+apache+mysql的集成环境软件,你可以任选一个,在google里面找找,很多人使用的,再找找帮助,如果看不懂,请找视频教程,对一个初学者来说,视频教程可能容易接受一些!

/

lz不明白呀!下载WAMP5和xampp这两个里面的其中一个,下载完安装上就行了!这两个软件是php集成开发环境,安装完这个软件之后,就等于你安装完php+apache+mysql了!

做网站怎么设置本地服务器?

我用的是“asp代码调试工具”。

其实这个不到一兆的软件已经十分够用,除礌你有什么非常特别的需求,比如说iis专业的组件,否则这个软件已经全部可以胜任。

我是Ghostxp系统,IIS从来都装不上。每次都是用这个

我使用的是2个版本,

一个是“asp代码调试工具”,测试打开的网址是 99端口。

第二个是“网站调试工具”,端口是默认80.如果80被占用,那么就随机开启一个端口。

其实也都是netbox核心的。

除了某些高级函数,比如 response.chaset session.chaset 用不上以为其他根本和IIS没什么两样,

如何在本地搭建一个服务器,可以外网访问的 5分

路由器上,将8888端口映射到服务器ip的8888端口,你差了这一步。 如果不会,直接将服务器ip添加到dmz中也行。

如何在本地搭建服务器?

可以使用IIS搭建服务器或者用Apache

如何在本地搭建服务器环境和数据库

1、假设论坛服务器在自己的计算机安装服务器操作系统如win2003 win2008 等。

2、配置服务器,并安装asp所需对应服务。如打开IIS服务,安装SQL Server 2005 ,Microsoft Visual Studio 2005等软件。

3、软件环境好了,接下来看你的上网方式。稳定的服务器一般使用静态IP地址和带宽,选择所在地区最好的出口,但这成本对于个人比较高。家庭用户动态IP地址则受网络运营商限制,不一定能做服务器使用(比如我们这就是,在电信网通都封掉了动态IP做服务器的可能性,不在同一个城市,根本访问不了)。动态IP可以通过动态域名解释软件如花生壳之类的,来绑定域名。当然,也可以通过直接访问IP地址来访问。

4、如果家里边使用路由,要在自己的路由上边设置端口映射。

如何在本地搭建IIS服务器

安装WINSOWS2000自带的IIS作为服务器。(WINSOWS98的PWS也可以,但是不推荐,安装大致和2000相同,这里就不详细说了。)

先是控制面板-添加或删除程序。

然后是添加删除windows组件-选中IIS组件前面的勾

装好以后打开控制面板中的管理工具,会发现多了两个图标,打开IIS管理器

选择默认WEB站点,然后右键属性或者直接按快捷键

如何建立本地sql服务器

你运行的Management Studio是管理工具(不是sqlserver服务器),是用来管理服务器的,新建服务器注册,就是连接到一个新的sqlserver服务器上。

要连接本机的sqlserver服务,请使用(local)或者是127.0.0.1,集成验证方式。

SQLServer在一台机器上是可以安装多个相互独立的服务(实例),用不同的实例名区分,但是一般不这么干,单独的服务一般就能满足需求了。

1、安装sqlserver,一般用默认实例名,并将当前用户添加为数据库管理员,安装过程中会让你设置验证方式(集成验证还是混合验证),如果你的程序使用用户名密码连接sql,则需要启用混合验证(并需要设置sa密码)

2、安装完成后(需重启),启动Management Studio连接本地数据库服务,连接后可以新建数据库,数据表(当然,你也可以用程序连接后用代码创建)

3、Management Studio 连接服务器时,和程序连接服务器一样,如果连接的SQLSERVER不是服务器上的默认实例名,则服务器地址后需要有实例名(形如:192.168.0.100\SQLEXPRESS),如果省略实例名则连接默认实例(默认实例名MSSQLSERVER)

如何在 android 本地搭建一个 服务器

在Android假设服务器,其最终的结果就是根据预先设定好的端口和Url访问到你预先放好的资源。

步骤简单的概括几部就是

1,实现NanoHttpd类

2,设置端口和路径

3,访问实验。

blog.csdn/...676835

如何在本地搭建一个ftp服务器

安装FTP服务

开始--》管理工具--》服务器管理器

安装IIS/FTP角色

打开服务器管理器,找到添加角色,然后点击,弹出添加角色对话框,选择下一步

选择Web服务器(IIS),然后选择FTP服务,直到安装完成。

在IIS中查看,如果能够右键创建FTP站点,则表明FTP服务安装成功

创建Windows用户名和密码,用于FTP使用。

开始--》管理工具--》服务器管理器,添加用户,如下图:本实例使用ftptest

在服务器磁盘上创建一个供FTP使用的文件夹,创建FTP站点,指定刚刚创建的用户FtpTest,赋予读写权限

客户端测试。直接使用ftp:服务器ip地址:ftp端口,如图。弹出输入用户名和密码的对话框表示配置成功,正确的输入用户名和密码后,即可对FTP文件进行相应权限的操作。

这个主要是要对socket的基本通讯流程比较熟悉,socket server端的流程是

建立socket

bind到特定的端口

listen指定连接数量

accept接受连接

建立连接后用read/write通讯

完成后用close清理资源

import socket 导入socket库

host='' 指明需要绑定的ip,为空应该是绑定本机所有Ip

port=51423 绑定的端口号

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 创建socket

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 设置socket的属性

s.bind((host,port)) 绑定端口

s.listen(1) 设置只允许一个client连接

print ("Server is running on port %dpress Ctrl-C to terminate." % port) 打印信息,提示端口号

while 1: 死循环等待连接

clientsock,clientaddr=s.accept() 等待直至有client连接,分别返回通讯用的socket和client的地址

clientfile=clientsock.makefile('rw',0) 创建用于通讯用的虚拟文件

clientfile.write("Welcome,"+str(clientaddr)+"\n") 向client发送消息

clientfile.write("please enter a string:")向client发送消息

line=clientfile.readline().strip() 读取client消息

clientfile.write("you entered %d characters.\n" % len(line)) 向client发送消息

clientfile.close() 关闭虚拟文件

clientsock.close() 关闭通讯用socket,通讯结束


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/315480.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存