`
王者无敌Java
  • 浏览: 70518 次
  • 性别: Icon_minigender_1
  • 来自: 盐城->长沙->深圳
社区版块
存档分类
最新评论

网络通信基础第一式——创建简单服务器

阅读更多
        寒假伊始,正式学习网络通信基础,虽然以前在Java程序设计课的实验课上我已经实现了简单的局域网聊天软件,但是感觉无论是服务器端还是客户机端的程序的健壮性都欠佳,一不小心就会崩溃,至整个程序于死地。而且,用户体验也很差,基本上找同学测试该软件时,我都得坐在他的旁边,生怕出错!所以,我决定寒假期间留校一星期好好再深入研究一下网络通信。因为我感觉这学期的计算机网络,TCP/IP以及Java程序设计等几门专业课学的都还不错,考试成绩也很理想,故有信心学好网络通信知识,并完善之前所编写的程序。
        长话短说,正式切入主题。我把网络通信基础比作一门武林绝学,而它的第一式便是创建一个简单的服务器,目的是能将客户机发来的字符串显示出来,并且再回送给客户机(客户机暂时使用telnet命令连接服务器)。

        以下是具体的代码实现:
第一步,在指定端口上创建一个ServerSocket对象,即服务器对象:
java.net.ServerSocket server = new java.net.ServerSocket(port);
System.out.println("服务器已经创建!" + "端口号是:" + port);

第二步,服务器创建成功后,便进入等待状态,等待客户机的连接:
// 等待客户机的进入,服务器进入阻塞状态
java.net.Socket client = server.accept();

注:调用服务器对象accept()方法时,程序就会“阻塞”在这个调用上,或者可以理解为服务器“卡”到这个函数调用上,直到有一个客户机连接上来,这个方法才会返回,返回一个Socket类对象,这个对象就代表了服务器与客户机之间的连接,以后,服务器与客户机的通信就在这个Socket类型的对象client上执行。

第三步,从Socket连接对象上调用方法得到输入输出流:
//从连接对象上得到输入/输出流对象
InputStream ins = client.getInputStream();
OutputStream ous = client.getOutputStream();

如果对套接字的输入输出流不甚了解,请看下图:

注:当你在指定端口创建了一个ServerSocket对象后,调用Server对象的accept()方法等待客户机连接进入;当客户机连接进入后,在服务器程序中,即得到了一个它们之间通话通道的连接对象Socket;最后,我们从这个Socket上得到输入输出流对象;当你向输出流中写数据时,数据就被发向客户机,如果你从输入流中读数据,读到的就是客户机发来的数据。

第四步,可以实现简单通信了。从输入流中读取数据,向输出流中写入数据,读到的是客户机发来的,写入的就会发送给客户机:
String msg = "您好!我是服务器king。。。\r\n";
byte[] data = msg.getBytes();// 取得组成这个字符串的字节
ous.write(data);// 用输出对象发送数据
ous.flush();// 强制输出
client.close();// 关闭与客户机的连接


第五步,整合之前的代码:
/**
 * 简单服务器的实现
 * @author king
 *
 */
public class ChatServer {
	/**
	 * 在指定端口上启动一个服务器
	 * 
	 * @param port
	 *            :服务器所用的端口号
	 */
	public void setUpServer(int port) {
		try {
			// 建立绑定在指定端口上的服务器对象
			ServerSocket server = new ServerSocket(port);
			System.out.println("服务器已经创建!" + "端口号是:" + port);
			// 让服务器进入等待状态:阻塞状态
			Socket client = server.accept();
			System.out.println("有一个客户机连接到服务器!");
			// 从连接对象上得到输入输出流对象
			InputStream ins = client.getInputStream();
			java.io.OutputStream ous = client.getOutputStream();
			String msg = "您好!我是服务器king。。。\r\n";
			byte[] data = msg.getBytes();// 取得组成这个字符串的字节
			ous.write(data);// 用输出对象发送数据
			ous.flush();// 强制输出
			client.close();// 关闭与客户机的连接
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//主函数
	public static void main(String[] args) {
		ChatServer cs = new ChatServer();
		cs.setUpServer(9090);
	}
}

        以上便是一个简单服务器的实现过程,有过编程经验的人一定会发现这个服务器bug很多,相当脆弱,别急,这才刚开始。。。。。。
  • 大小: 47.4 KB
1
1
分享到:
评论
2 楼 王者无敌Java 2011-01-18  
hnwsj99 写道
不用闭门造车了,使用现成的框架吧,比如MINA,我最近写的一个程序就是基于MINA的,相当不错。。。

大哥。。。我是学生,得从基础开始啊!
1 楼 hnwsj99 2011-01-18  
不用闭门造车了,使用现成的框架吧,比如MINA,我最近写的一个程序就是基于MINA的,相当不错。。。

相关推荐

    网络通信基础第五式——实现自定义字节流协议的KTM

    这篇名为“网络通信基础第五式——实现自定义字节流协议的KTM”的博客文章聚焦于如何设计和实现一个自定义的字节流协议,名为KTM(King Talk Message)。本文将深入探讨这个主题,解析其背后的原理和技术细节。 ...

    vc网络通信编程实用案例精选——源代码.rar

    在《VC网络通信编程实用案例精选(第二版)——源代码》这个压缩包中,读者可以找到以上所有知识点的实现代码,通过实践学习加深理解。每份源代码都是一个独立的案例,涵盖了从基础到高级的网络编程技巧,是提升VC++...

    安卓Android源码——客户端连接服务器并交互实例.zip

    - Socket是网络通信的基础,它提供了进程间通信(IPC)的能力,允许Android应用创建TCP连接到服务器。 - `Socket`类和`ServerSocket`类在Java中被用来创建客户端和服务器的连接。客户端通过`Socket`连接到服务器的...

    Java——简单Web服务器实现[收集].pdf

    在Java编程中,创建一个简单的Web服务器是一个常见的学习实践,这有助于理解网络通信的基础以及HTTP协议的工作原理。这个简单的Web服务器主要目标是接收客户端请求,查找同一文件夹下的资源,并将其发送回客户端。...

    Java——简单Web服务器实现[借鉴].pdf

    在这个例子中,服务器检查请求行的第一个单词是否为"GET",如果是,那么它会尝试找到并发送请求的URL所指向的资源。 8. **资源查找与响应**: - 服务器需要根据HTTP请求中的URL查找本地文件。这里没有详细展示这...

    Android源码——口袋微博服务器客户端代码.7z

    1. **网络请求库**:在Android中,最基础的网络请求方式是使用HttpURLConnection,但因其API复杂,开发者常选择使用第三方库如OkHttp,它提供了更简洁的接口和更好的性能。OkHttp支持异步请求,可以设置缓存策略,...

    用tcp+ip+进行网际互联+第三卷:客户——服务器(含全部配套源代码).rar

    《用TCP/IP进行网际互联》是一套深入探讨网络通信协议的经典著作,特别是第三卷,主要聚焦于客户-服务器架构,这一部分对于理解互联网的工作原理至关重要。本卷内容包括了详细的理论知识和配套的源代码,旨在帮助...

    安卓Android源码——口袋微博 服务器 客户端代码.zip

    《安卓Android源码——口袋微博 服务器 客户端代码》是针对移动应用开发者的一份珍贵资源,它包含了实现一个类似口袋微博应用的完整代码结构,涵盖了客户端与服务器的交互。这份源码提供了深入理解Android应用程序...

    计算机网络————第1章 计算机网络与因特网

    计算机网络是现代社会不可或缺的信息基础设施,其作用是实现不同计算机系统之间的信息交换与资源共享。本章首先介绍了计算机网络的基本概念和其在全球范围内的扩展——因特网。接着探讨了计算机网络的组成部分,包括...

    Linux服务器架设指南——第1章

    【Linux服务器架设指南——第1章】章节主要讲解了计算机网络基础知识,特别是关于局域网的硬件知识。首先,计算机网络是通过通信设备和线路将地理位置分散的计算机系统连接在一起,实现资源共享和信息传递的系统。...

    Android源码——口袋微博服务器客户端代码.zip

    在本压缩包“Android源码——口袋微博服务器客户端代码.zip”中,包含了Android平台上的一个微博客户端应用的源代码。这个应用可能是一个简化版或学习示例,旨在帮助开发者了解如何实现一个与服务器进行交互的...

    安卓Android源码——口袋微博服务器客户端代码.zip

    这篇文档将深入解析《安卓Android源码——口袋微博服务器客户端代码》的相关知识点,主要围绕安卓应用开发、源码分析以及服务器通信技术展开。 首先,我们要理解的是“安卓Android”。安卓是一种基于Linux内核的...

    Android源码——与php服务器交互实例源码_new_25.zip

    6. **图片资源**:文件名1_121021102125_2.png、1_121021102125_1.png、1_121021102125_3.png可能是用于展示的图片,例如在UI设计中展示数据,或者作为请求的一部分发送到服务器进行图像处理。 7. **实例源码**:...

    网络服务器配置与管理——WindowsServer2012R2篇(微课版)_PPT.zip

    《网络服务器配置与管理——Windows Server 2012 R2篇》是一份全面的教学资料,专注于教授如何在Windows Server 2012 R2环境下进行网络服务器的配置与管理。这一系列微课包含了从基础到高级的多个章节,旨在帮助用户...

    11.4.4 通信缓慢——服务器延迟 - Wireshark 数据包分析实战(第 3 版) - 知乎书店1

    在Wireshark数据包分析实战第三版中,我们聚焦于一个特定的问题——11.4.4章节讨论的“通信缓慢——服务器延迟”。这个场景通过分析一个名为"latency4.pcap"的网络捕获文件来展示。在图11-25中,我们看到在服务器...

    安卓Android源码——简易微信客户端和服务器源码.zip

    这篇文档将深入解析《安卓Android源码——简易微信客户端和服务器源码》的相关知识点,旨在帮助读者理解Android应用开发的基本原理以及如何构建一个简单的微信类通信应用。首先,我们要了解Android系统的基础架构和...

    Python项目案例开发从入门到实战源代码第14章 网络通讯案例——基于UDP的网络五子棋.rar

    在本项目案例中,我们将深入探讨如何使用Python进行网络通讯,特别是通过用户数据报协议(UDP)实现一个网络五子棋游戏。这个案例是针对初学者设计的,旨在帮助他们从入门到实战,掌握Python在实际项目中的应用。 ...

    手机安全卫士(3)——获取服务器更新配置

    总的来说,手机安全卫士获取服务器更新配置的过程是Android应用与服务器交互的一个实例,涵盖了网络通信、数据解析和本地更新等多个关键环节。理解和实践这个过程有助于开发者提升自己的Android开发技能,特别是在...

    Netty 框架学习 —— 第一个 Netty 应用(csdn)————程序.pdf

    在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...

Global site tag (gtag.js) - Google Analytics