在这一段,我们的目地是创建一个简单服务器,能将客户机发来的字符串显示出来,并且再回送给客户机——有必要解释一下:在这里,服务器指的是等待别人来连接的机器;客户机,当然就指的是主动去连接别人的机器了,这就像打电话过程中的主叫与被叫的区分一样,一旦连结成功,就不存在这样谁是客户机谁是服务器的区分了。
Java中编写网络通信程序,必须用到java.net包下面的API。创建一个服务器,相当简单。
第一步:在指定端口上创建一个java.net.ServerSocket对象,如下代码:
ServerSocket server=new ServerSocket(9090);
System.out.println("服务器创建成功!"+port);
|
第二步:服务器创建成功后,就像手机开机后,进入待机状态一样,你也要让服务器进入等待状态,当然是等待其他的客户机来连接:
//在等待客户机连接进入,进入后,生成一个Socket对象
java.net.Socket client=server.accept();
System.out.println("Incoming "+client.getRemoteSocketAddress());
|
注意:调用服务器对象server.accept()方法时,程序就会“阻塞”在这个调用上,或者说“卡”到这里——直到有一个客户机连接上来,这个方法才会返回,返回一个Socket类对象——这个对象就代表了服务器与客户机之间的连接。可以这样理解:当你拔通我的手机时,可以理解为我的机手机中存在着一个“通话对象”,就相当于此的client对象;以后(服务器)与客户机的通信,就在这个Socket类型的对象client上进行。
第三步:从Socket连接对象上调用方法得到输入输出流:
java.net.Socket client=server.accept();
//从连接对象上得到输入流和输出流对象
OutputStream out=client.getOutputStream();
InputStream ins=client.getInputStream();
|
如果这段代码难以理解,请看下图1.10所示和解说。
图1.10 网络通信连接示意图
图1.10所示网络通信过程如下:当你在指定端口创建了一个ServerSocket对象后,就相当于你买了一部手机,且申请到了一个手机号,但此时还不能通话——除排你开机进入待机状态,就如同程序中调用Server对象的accept()方法等待客户机连接进入;当客户机连接进入后,在服务器程序中,即得到一个代表它们之间通话通道的连接对象Socket。
最后从这个Socket上得到输入、输出流对象:当一个电话接入后,你手机中的喇叭就相当于此的输出流对象,输入流对象自然的对应于手机中的话筒。你向输入流中写入的数据,就被发向了客户机,如果你从输出流对象中读取数据,读到的就是客户机发来的数据。
第四步:你使用输入/输出流对象进行通信数据的读写:从输入流中读取数据,向输出流中写入数据。读到的数据,即是客户机发来的数据;写出的数据,就会发送给客户机!发送的代码如下所示:
String s="你好,欢迎来javaKe.com\r\n";
//取得组成这个字符串的字节
byte[] data=s.getBytes();
//用输出对象发送!
out.write(data);
out.flush();//强制输出
//半闭与客户机的连接
client.close();
|
第五步:最后,将如上步骤完整地集成起来,得到如下代码所示:
/**
* 简单服务器实现
* @author www.NetJava.cn
*/
public class ChatServer {
/**
* 在指定端口上启动一个服务器
* @param port:服务器所以的端口
*/
public void setUpServer(int port){
try{
//建立绑定在指定端口上的服务器对象
ServerSocket server=new ServerSocket(port);
System.out.println("服务器创建成功!"+port);
//让服务器进入等待状态:阻塞状态
Socket client=server.accept();
//从连接对象上得到输入输出流对象
OutputStream out=client.getOutputStream();
InputStream ins=client.getInputStream();
String s="你好,欢迎来javaKe.com\r\n";
byte[] data=s.getBytes();//取得组成这个字符串的字节
out.write(data); //用输出对象发送数据!
out.flush();//强制输出
client.close();//半闭与客户机的连接
}catch(Exception ef){
ef.printStackTrace();
}
}
//主函数
public static void main(String[] args) {
ChatServer cs=new ChatServer();
cs.setUpServer(9090);
}
}
|
如果以上程序运行成功,你可能会有疑问?客户机在哪里呢?我是怎么做为一个客户机连接上这段代码所实现的服务器打开的9090端口呢?这个简单,还记得上一节所述的telnet吗?物理上,一台计算机,可以在逻辑中的分成客户机和服务器两部分。现在你手前的计算机就是一台服务器,当你进入命令行,执行telnet命令后,它同时又是一台客户机。这样,本地的IP地址可以用”localhost”这个词指代,当然不包括双引号。如图1.11所示,使telnet客户端连接你开发的服务器程序。
图1.11 使用telnet命令连接自已的服务器
回车后,你的telnet客户端应接收并显示服务器发送来的消息。如图1.12所示。
图1.12 telnet客户端接收到服务器发来的消息
当然,你也可以在局域网中其他电脑的命令行中输入“telnet 你的ip 端口”命令,测试接收服务器输出的消息。
以上步骤中,如果运行服务器出错,可能会在控制台看到报错信息:
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at cn.netjava.chatv2.ChatServer.setUpServer(ChatServer.java:20)
at cn.netjava.chatv2.ChatServer.main(ChatServer.java:42)
|
该引起报错的原因,是设定给服务器的端口已经被其他程序占用了。换一个端口号试试?当然,不要以为端口号是个int型数值就可以,不能小于零或大于65535啦!
如果一切正常,最后,你还是发现了一个极大的缺陷:一个客户机连接上来后,收到服务器发出的一条消息,服务器程序就退出了。如此不稳定,怎担当服务器角色?想要解决这个问题,请进入下一节。
- 大小: 55.9 KB
- 大小: 2.5 KB
- 大小: 3.5 KB
分享到:
相关推荐
在本项目"Node.js+Angular实现简易聊天室"中,我们将深入探讨如何使用这两种流行的开源技术构建一个实时的在线聊天应用程序。Node.js以其高效的非阻塞I/O模型和JavaScript运行时环境,成为后端开发的强大工具,而...
本文将详细解析一个简单的C语言实现的代理服务器,特别针对SOLARIS操作系统。这个代理服务器的代码是为服务器软件开发提供基础的理解和实践。 首先,我们需要了解代理服务器的基本工作原理。代理服务器接收来自...
安装和引用AjaxPro.2.dll非常简单。首先,你需要将dll文件添加到你的ASP.NET项目的引用中。这可以通过在Visual Studio的"项目"菜单中选择"添加引用",然后在"浏览"选项卡中找到AjaxPro.2.dll并将其添加进来。完成这...
在“下一步”中,选择“邮件服务器(POP3,SMTP)”选项,这将引导系统安装必要的邮件服务组件。接着,选择合适的用户身份验证方法,通常在域环境中推荐使用“Active Directory集成的”方式,以实现与域账户的统一认证...
实现一个简单的HTTP服务器,一般需要以下步骤: 1. **监听网络连接**:使用socket API创建一个监听套接字,并设置为监听模式,等待客户端的连接请求。通常会绑定到特定的IP地址和端口号。 2. **接受连接**:当有...
### 在Linux上建立LDAP服务器(一步一步):详细知识点解析 #### 一、LDAP的基本概念 - **LDAP的作用**: - 提供集中化的访问、认证和授权管理。 - 支持用户和用户组管理的集中化。 - 信息存储的集中化。 - ...
即时通信服务器是网络环境中用于实现实时交流的关键组件,它为用户提供快速、高效的信息传递服务。本篇将重点介绍即时通信服务器的相关知识点,包括RTX服务器的安装与配置以及FICQ的安装与配置。 首先,RTX(Real ...
通过"一步一步学ActionScript 2"的教程,你将逐步掌握这些技能,从简单的交互到复杂的程序设计。这个过程可能包括实践项目,如创建动态图表、响应式用户界面、甚至完整的互动游戏。不断练习和应用这些知识,你将成为...
《开发云服务器——基于LoRa网络的技术实现》 在物联网(IoT)领域,LoRa网络因其长距离、低功耗的特性而受到广泛关注。本文将深入探讨如何开发一款云服务器,以支持LoRa网络的数据采集和处理。本文适合从事LoRa网络...
本资源是一个简单的WebSocket服务器端实现,通过源码分析,我们可以学习到WebSocket服务如何创建和管理连接,以及如何处理来自客户端的消息。 首先,我们需要了解WebSocket的基本工作流程: 1. 客户端发起一个HTTP...
在这个"labview 简单TCP服务器客户端案例"中,我们可以探讨如何在LabVIEW中实现基于TCP协议的通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保了数据在...
IIS 6.0 包括一些面向组织、IT 专家和 Web 管理员的新功能,它们旨在为单台 IIS 服务器或多台服务器上可能拥有的数千个网站实现性能、可靠性和安全性方面的目标。 IIS 6.0 版本包括了 Web 服务器、FTP 服务器、SMTP...
为了演示Web服务器的使用,我们将在此环境下部署三个虚拟主机——zc1、zc2和zc3。虚拟主机允许在同一服务器上运行多个独立的网站,每个都有自己的标识,可以是主机名、IP地址或IP地址加端口号。以下是如何通过分配...
下面是一个简单的客户服务器应用的示例: 服务器端: ```perl import socket # 创建socket对象 serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname()...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让开发者可以在服务器端使用JavaScript编写代码,实现了全栈开发的可能性。为了处理HTTP请求,Node.js提供了内置的http模块,同时Express框架使得构建Web...
Web服务(Web Service)是一种基于网络的、标准化的模块化组件,可以被不同平台的应用系统调用,实现数据交换和业务协同。Axis是Apache软件基金会的一个开源项目,它提供了Java平台上的Web服务开发工具,使得开发者...
### 跨服务器登录验证(单点登录SSO)的过程与Java实现 #### 一、单点登录(SSO)概述 单点登录(Single Sign-On,简称SSO)是一种身份验证机制,它允许用户只需进行一次登录操作即可访问多个应用系统。这种机制极大地...
在Android平台上实现简易服务器和客户端是一项常见的编程任务,主要用于设备之间的通信或数据交换。这个项目是使用Eclipse IDE编写的,它包含了一个简单的服务器端应用和一个客户端应用,两者通过Socket进行连接。...
DHCP(Dynamic Host Configuration Protocol)是一种自动分配IP地址的协议,能够使计算机自动获得IP地址、子网掩码、默认网关和DNS服务器地址等信息,从而实现网络连接。 DHCP服务器的安装可以有多种方法,一种是新...
总的来说,理解如何使用Python实现简单的HTTP服务器是学习网络编程和Web开发的重要一步。这不仅能让你掌握基础的网络通信概念,还能为构建更复杂的Web应用程序打下坚实的基础。在实践中,你还可以探索其他高级特性,...