计算机网络与通信实习报告
设 计 题 目 一对一聊天程序的设计
学生专业班级
学生姓名(学号)
指 导 教 师
完 成 时 间 2010年5月23日
2010年 5月 23日
实 习(设计)地点 机房 139 ,112
一、 课程设计目的和任务
1. 课程设计的题目及要求
实现一个一对一的聊天程序。其基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以分别部署在两台电脑上。 2. 课程设计的目的
(1) 通过课程设计掌握客户机/服务器模式的工作原理; (2) 进一步理解并掌握该模式在聊天程序中的运用;
(3) 通过课程设计锻炼了动手实践能力,提高了JAVA编程的能力。
二、 原理概述与设计方案
1.套接字原理
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。 2. 服务器/客户端原理分析
网络应用进程通信时,普遍采用客户机/服务器交互模式(Client-Server paradigm of interaction),简称C/S模式。这是Internet上应用程序最常用的通信模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。
客户机采取的是主动请求方式,其工作过程如下:
(1)打开一通信通道,并连接到服务器所在主机的特定监听端口。
(2)向服务器发送请求报文,等待并接收应答,然后继续提出请求。与服务器的会话按照应用协议进行。
(3)请求结束后,关闭通信通道并终止。
服务器处于被动服务的地位。首先服务器方要先启动,并根据客户请求提供相应服务,服务器的工作过程如下:
(1)打开一通信通道,并告知服务器所在的主机,它愿意在某一公认的地址上(熟知端口,如FTP为21)接受客户请求。 (2)等待客户的请求到达该端口。
(3)服务器接收到服务请求,处理该请求并发送应答信号。 (4)返回第(2)步,等待并处理另一客户请求。 (5)在特定的情况下,关闭服务器。
C/S模式所描述的是进程之间服务与被服务的关系。客户机是服务的请求方,服务器是服务的提供方。有时客户机和服务器的角色可能不是固定的,一个应用进程可能既是客户机,又是服务器。
C/S模式的无连接套结字编程模型具有以下特点:
(1)应用程序双方是不对等的,服务器要先行启动,处于被动的等待访问的状态,而客户机则可以随时主动地请求访问服务器。两者在进行网络通信时,服务器要经过创建套接字、绑定套结字、交货时间和关闭套结字4个阶段,而客户机端不需要进行套结字的绑定。
(2)服务器进程将套结字绑定到众所周知的端口,或事先指定的端口,并且,客户机端必须确切地知道服务器端套结字使用的网络地址。
(3)客户机端套结字使用动态分配的自由端口,不需要进行绑定,服务器端事先也不必知道客户机端套结字使用的网络地址。
(4)客户机端必须首先发送数据报,并在数据报中携带双方的地址;服务器端收到后,才能知道客户机端的地址,才能给客户机端回送数据报。 (5)服务器可以接受多个客户机端的数据。 3.详细设计
本次课程设计是运用Java语言来实现的。 具体步骤如下:
(1)创建一个Socket,实现与服务器的连接,Socket构造函数建立与服务器的连接。如果连接成功,则该语句返回一个Socket。如果连接失败,则抛出IOException的一个子类的实例。
(2)客户使用Socket方法getInputStream和getOutputStresm,获得Socket的InputStream和OutputStream引用。 (3)处理阶段,客户和服务器通过OutputStream和InputStream对象进行通信。 (4)当传输完成时,客户通过调用流和套结字的close方法关闭连接。处理服务器发送的信息时,客户必须判断服务器何时完成信息发送,从而可以调用close关闭Socket连接。
三、 源代码程序(写主要代码)
1. Server.java源代码 import java.io.*; import java.net.*; import java.awt.*;
import java.awt.event.*; import javax.swing.*;
public class Server extends JFrame {
public Server() //构造函数,创建服务器的GUI界面 {
} //end constructor
public void runServer() //设置服务器,接受连接请求 {try
{server = new ServerSocket(12345, 100 ); while ( true ) {try
{waitForConnection(); getStreams();
processConnection();}
catch ( EOFException eofException )
{System.err.println(\"Server terminated connection \");} finally
{closeConnection(); ++counter;} }//end while }//end try
catch ( IOException ioException ) {ioException.printStackTrace();} }//end mehtod runServer
private void waitForConnection() throws IOException { }//等待客户连接
private void getStreams() throws IOException { }//获取连接的流引用
private void processConnection() throws IOException { } //把连接信息发送给客户 private void closeConnection() { }//中止客户连接
private void sendData( String message ) { }
private void displayMessage( final String messageToDisplay )
{ } //显示消息
private void setTextFieldEditable( final boolean editable ) { } //设置文本框的编辑状态 public static void main( String args[]) {//主函数
Server application = new Server();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); application.runServer(); } }
2. Client.java源代码 import java.io.*; import java.net.*; import java.awt.*;
import java.awt.event.*; import javax.swing.*;
public class Client extends JFrame {
public Client( String host ) //构造方法,创建GUI界面 {
super( \"Client\" ); chatServer = host;
Container container = getContentPane();
}
private void runClient()
{ }//运行方法,建立与服务器的连接,处理消息,关闭连接 private void connectToServer() throws IOException { }//创建一个套接字client,建立连接
private void getStreams() throws IOException { }//获取对Socket流对象的引用
private void processConnection() throws IOException { }//接收并显示从服务器那里接收到的消息 private void closeConnection() { }//关闭流和Socket
private void sendData( String message ) { }//发送字符串到服务器
private void displayMessage( final String messageToDisplay ) { }
private void setTextFieldEditable( final boolean editable ) { }
public static void main( String args[] ) //main方法,创建类的实例 {
Client application; if ( args.length == 0) {
application = new Client( \" 127.0.0.1\" ); }
else
enterField = new JTextField(); enterField.setEditable( false ); enterField.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event ) {
sendData( event.getActionCommand() ); enterField.setText( \"\" ); } } );
container.add( enterField, BorderLayout.NORTH ); displayArea = new JTextArea();
container.add( new JScrollPane( displayArea ), BorderLayout.CENTER ); setSize( 300,150 ); setVisible( true );
{
application = new Client( args[0] ); application.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
application.runClient(); } } }
四、 运行结果
1.编译并运行Server.java,如下图所示
运行结果:
2.编译并运行客户端程序Client.java
运行结果:
3.客户端向服务器发送消息
4.服务器向客户端回复消息
运行结果:
五、 实习总结与体会
1.实习时首先查阅图书,在网上进行搜索,尽可能多的了解及掌握相关知识,对课程设计有一个整体把握,根据设计的具体要求一部分一部分的解决,参考要求设计出程序的流程,然后在计算机上编辑、调试源程序,经过不断调试最终设计成功,完成报告。
2.通过本次课程设计,我对计算机网络这门课程有了更高层次上的理解,尤其是对套接字和客户机/服务器模式的相关知识;对于java语言也有了更多的接触,做出聊天的程序增加了我对网络编程的兴趣。在进行设计时遇到的难题不少,和同学讨论,认真思考分析,对程序进行分析、调试、研究与总结,并进行讨论,这期间都学到了很多。在实践中掌握的本领比只在课堂上听讲要受益良多。
3.同时,深深感受到团结的力量,认识到自己在实践动手能力方面还有很大欠缺。但我会更加努力,平时注重提高自己的实践动手能力,争取更大的进步。
六、参考书目
[1] 陈鸣,计算机网络实践教程,机械工业出版社. [2] 叶树华、高志红,《网络编程实用教程》,人民邮电出版社,2006年10月 [3] 谢希仁.计算机网络(第5版)北京电子工业出版社,2008年10月 [4] H.M.Deitel,P.J.Deitel,《Java程序设计教程》(第五版),清华大学出版社,2004年3月
课程设计成绩评定表
学生姓名 专业班级 通信07-2 设计题目 一对一聊天程序的设计 指导教师评语及意见: 指导教师评阅成绩: 指导教师签字: 年 月 日