- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
实验五 局域网聊天程序的实现
一、实验目的
通过局域网聊天程序的设计与实现,掌握应用进程之间通信的基本原理。二、实验原理
大多数操作系统使用系统调用(systemcall)的机制在应用程序和操作系统之间传递控制权。对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统。
当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口。此接口再将控制权传递给计算机的操作系统。操作系统将此调用转给某个内部过程,并执行所请求的操作。内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。因此,系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即应用编程接口API(ApplicationProgrammingInterface)。
微软公司在其操作系统中采用了套接字接口API,形成了一个稍有不同的API,并称之为WindowsSocket。
当应用进程需要使用网络进行通信时就发出系统调用,请求操作系统为其创建“套接字”,以便把网络通信所需要的系统资源分配给该应用进程。
套接字的数据结构如下所示:协议族:PF_INET
服务:SOCK_STREAM
本地IP地址:远地IP地址:本地端口:
远地端口:
??
当套接字被创建后,它的端口号和IP地址都是空的,因此应用进程要调用bind(绑定)来指明套接字的本地地址。在服务器端调用bind时就是把熟知端口号和本地IP地址填写到已创建的套接字中。这就叫做把本地地址绑定到套接字。
服务器在调用bind后,还必须调用listen(收听)把套接字设置为被动方式,以便随时接受客户的服务请求。UDP服务器由于只提供无连接服务,不使用listen系统调用。
服务器紧接着就调用accept(接受),以便把远地客户进程发来的连接请求提取出来。系统调用accept的一个变量就是要指明从哪一个套接字发起的连接。
具体的顺序如下所示:
客户端 服务器端
socketbind
socket listen
connect 连接建立请求 accept
sendrecvclose
recvsendclose
通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作系统回收与该套接字相关的所有资源。
聊天程序是Socket网络编程的基本应用之一,其本质是数据在通信双方的发送和接收。可以利用VisualBasic的Winsock控件,或者VisualC++的Csocket等等都可以轻易实现计算机之间的通信。
三、实验步骤
本次实验的实验步骤由同学们自行完成。用java实现。
1、客户端应用程序的设计实现两个客户端窗口:
2
效果示意图:
客户端代码:
importjava.awt.*;
importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.*;
importjava.net.*;
publicclassChatClientextendsFrame{Sockets=null;
DataOutputStreamdos=null;DataInputStreamdis=null;privatebooleanbConnected=false;
TextFieldtfTxt=newTextField();TextAreataContent=newTextArea();
ThreadtRecv=newThread(newRecvThread());
3
publicstaticvoidmain(String[]args){
newChatClient().launchFrame();
}
publicvoidlaunchFrame(){setLocation(400,300);
this.setSize(300,300);add(tfTxt,BorderLayout.SOUTH);
add(taContent,BorderLayout.NORTH);pack();
this.addWindowListener(newWindowAdapter(){
@Override
publicvoidwindowClosing(WindowEvente){disconnect();
System.e
文档评论(0)