利用Socket实现双机通讯.docx

上传人:b****6 文档编号:8722094 上传时间:2023-02-01 格式:DOCX 页数:10 大小:98.63KB
下载 相关 举报
利用Socket实现双机通讯.docx_第1页
第1页 / 共10页
利用Socket实现双机通讯.docx_第2页
第2页 / 共10页
利用Socket实现双机通讯.docx_第3页
第3页 / 共10页
利用Socket实现双机通讯.docx_第4页
第4页 / 共10页
利用Socket实现双机通讯.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

利用Socket实现双机通讯.docx

《利用Socket实现双机通讯.docx》由会员分享,可在线阅读,更多相关《利用Socket实现双机通讯.docx(10页珍藏版)》请在冰豆网上搜索。

利用Socket实现双机通讯.docx

利用Socket实现双机通讯

河南理工大学

计算机科学与技术学院

课程设计报告

2014—2015学年第二学期

 

课程名称计算机网络

设计题目利用Socket实现双机通讯

学生姓名*****

学号************

专业班级********

指导教师********

2015年6月30日

 

 

利用Socket实现双机通讯

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。

Socket通常用来实现客户方和服务方的连接。

Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。

在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。

一个连接就建立起来了。

Server端和Client端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  

(1)创建Socket;

  

(2)打开连接到Socket的输入/出流;

  (3)按照一定的协议对Socket进行读/写操作;

  (4)关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。

一.设计任务

1.利用JavaSocket来实现双机通信,理解其通信原理。

图1.1

2.在Java环境下,采用指基于TCP/IP协议的JavaSocket编程,实现文本数据的交换。

二.Java语言

Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言

(1)Java语言是简单的

Java语言是简单的。

Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。

另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。

特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧

(2)Java语言是一个面向对象的

Java语言是一个面向对象的。

Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。

Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。

总之,Java语言是一个纯的面向对象程序设计语言。

Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。

在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。

Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。

Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。

(3)Java语言是分布式的

Java语言是分布式的。

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。

Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段

(4)java语言是多线程的

java语言是多线程的。

在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。

通常有两种方法来创建线程:

其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。

值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。

线程的活动由一组方法来控制。

Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。

(5)体系结构中立

Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。

Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。

为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。

java.lang:

一般的语言包。

其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包

java.util:

实用工具包。

其中包括哈希表、堆栈、时间和日期等

java.io:

基于流模型的输入/输出包。

该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等

:

网络包。

该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口

java.awt:

抽象窗口工具集。

其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等

java.applet:

支持applet程序设计的基本包

(6)java语言是安全的

java语言是安全的。

Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。

除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵

三.JAVASockets编程概述:

用Java语言编程实现Socket通信,其原理与使用其他语言基本相同,不同之处是:

(1)java是跨平台的编程语言,所以用java编写的Socket通信程序可以工作在所有支持TCP/IP协议和java的软硬件平台上;

(2)因为Java是面向对象的语言,所以在编程中需要使用一些与Socket有关的系统类,其中用于实现流Socket的类主要有:

InetAddress类,Socket类,ServerSocket类

InetAddress类的对象用来保存IP地址,Socket类的对象用来创建Socket通信的客户端,Socket通信的服务器端则有ServerSocket类的对象来实现,用上述几个类就可以很方便的生成用户自己的TCP/IP通信程序。

这几个类都属于J包,大部分用来处理网络操作的系统类都包含在这个包中,所以用JAVA编写程序时,一般要在程序开始部分用import语句加载这个类包,以便引入这种类。

用JAVA语言编写Socket程序的过程就是创建和定义Socket类和ServerSocket类的子类的过程。

四.TCP简介及特点原理

TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transportlayer)通信协议。

在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。

因特网协议中,TCP层是位于网络层之上,应用层之下的中间层。

不同主机的应用层之间需要可靠的、像管道一样的连接。

但是,网络层不提供这样的流机制,而是提供不可靠的包交换。

TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,他是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。

在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。

在拥塞控制上,采用慢启动算法。

与此同时,TCP提供计算机程序间连接、检测和丢弃重复的分组、完成数据报的确认、流量控制和网络拥塞等。

五.TCP的服务流程

TCP和UDP都使用相同的网络层,但是TCP是向应用层提供与UDP完全不同的服务,TCP提供一种面向连接的、可靠的字节流服务。

  面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此进行数据交换之前必须先建立一个TCP连接,这一过程与接打电话很相似。

只有建立了一个TCP连接,双方才可以进行通信。

而广播、多播是不能进行TCP通信的。

TCP通过下列方式来提供可靠性:

应用数据被分割成TCP认为最适合发送的数据块。

UDP通信中,应用程序产生的数据报长度将保持不变。

由TCP传递给IP的信息单位称为报文段或段(segment)。

当TCP发出一个段后,就启动一个定时器,等待目的端确认收到这个报文段。

如果无法及时收到一个确认,那么将会重发这个报文段。

当TCP收到发自TCP连接另一端的数据,它将会发送一个确认。

这个确认不是立即发送,通常将推迟几分之一秒。

TCP将保持它的首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。

如果收到段的检验和有差错,TCP将丢弃这个报文段,不确认收到此报文段。

TCP还能提供流量控制。

TCP连接的每一方都有固定大小的缓冲空间。

TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。

这将防止较快主机致使较慢主机的缓冲区溢出。

TCP对字节流的内容不作任何解释。

TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。

对字节流的解释由TCP连接双方的应用层解释。

 

六.客户—服务器通信的实现

(1)服务器端的开发

1.服务器端实现对主机某个端口不断监听,并不间断地接受客户端的连接请求,当受到连接后打印客户的的信息,并向客户端完成一次服务

2.使用readUTF方法的DataInputStream处理流提供的方法,功能为读取满足UTF格式的字符串。

并使用writeUTF方法为DataOutputStream处理流提供的方法,功能为写出满足UTF格式的字符。

一般在网络中发生消息都在发送端用writeUTF方法写,在接收端使用readUTF方法读取,这样程序的兼容性强,不容易受到乱码。

(2)客户端的开发

1.客户端用于对某个固定IP的服务器进行连接,接着向服务器发送一条消息,最后接受服务器的返回消息并打印。

2.为了与服务器对应,发送消息还要使用DataInputStream的writeUTF方法。

同时应该注意的两边的首发顺序是互逆的,服务器现售后发,客户端先发后收。

七.程序的实现

(1)客户端的实现

客户器端用一个类Client来实现,创建一个Socket类的对象,实现对端口9000的不断监听,直到受到客户端的信息。

客户端代码如下:

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStream;

importjava.io.OutputStreamWriter;

import.Socket;

import.UnknownHostException;

importjava.util.Scanner;

publicclassClient{

publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{

Sockets=newSocket("localhost",9000);

OutputStreamos=s.getOutputStream();

OutputStreamWriterosw=newOutputStreamWriter(os,"UTF8");

BufferedWriterbw=newBufferedWriter(osw);

InputStreamis=s.getInputStream();

InputStreamReaderisr=newInputStreamReader(is,"UTF8");

BufferedReaderbr=newBufferedReader(isr);

Scannerscanner=newScanner(System.in);

Stringmsg=scanner.nextLine();

while(!

"bye".equals(msg)){

bw.write(msg);

bw.newLine();

bw.flush();

Stringrmsg=br.readLine();

System.out.println(s.getRemoteSocketAddress().toString()+":

"+rmsg);

msg=scanner.nextLine();

}

bw.write(msg);

bw.newLine();

bw.flush();

bw.close();

br.close();

//scanner.close();

s.close();

}

}

运行结果

(2)服务器端的实现

服务器端主要用Server类来实现对服务器端的连接功能,创建一个ServerSocket对象实现对客户端的连接。

服务器端代码如下:

importjava.io.BufferedReader;

importjava.io.BufferedWriter;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStream;

importjava.io.OutputStreamWriter;

import.ServerSocket;

import.Socket;

importjava.util.Scanner;

publicclassServer{

publicstaticvoidmain(String[]args)throwsIOException,

InterruptedException{

//ServerSocketss=newServerSocket(8080);

ServerSocketss=newServerSocket(9000);

while(true){

Sockets=ss.accept();

MyThreadt=newMyThread(s);

t.start();

}

}

}

classMyThreadextendsThread{

privateSockets;

publicMyThread(Sockets){

this.s=s;

}

publicvoidrun(){

try{

System.out.println("客户连接请求到来,等待对客户的处理结果");

InputStreamis=s.getInputStream();

InputStreamReaderisr=newInputStreamReader(is,"UTF8");

BufferedReaderbr=newBufferedReader(isr);

Scannerscanner=newScanner(System.in);

OutputStreamos=s.getOutputStream();

OutputStreamWriterosw=newOutputStreamWriter(os,"UTF8");

BufferedWriterbw=newBufferedWriter(osw);

Stringmsg=br.readLine();

while(!

"bye".equals(msg)){

System.out.println(s.getRemoteSocketAddress().toString()+":

"

+msg);

Stringrmsg=scanner.nextLine();

bw.write(rmsg);

bw.newLine();

bw.flush();

msg=br.readLine();

}

bw.close();

br.close();

scanner.close();

s.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

运行结果:

(3)打包发布

应用程序的发布,需要将程序进行打包,可以把程序中涉及的类和图片压缩为一个jar文件,以便利发布程序。

八.实验中的问题

1、建立Socket连接时,两端的端口号必须一致,否则无法建立连接。

2、建立连接时,应首先运行服务器端,再运行客户端,否侧连接失败。

3、建立好连接之后,必须按照给定的格式输入通信信息。

4、若使用的端口被其他程序占用,则其他程序就不能使用这个端口。

九.课程设计的总结体会

通过利用JavaSocket来实现双机通信,实现一个简单的客户——服务器通信功能。

对JavaSocket的功能实现,并对其进行分析、了解,以达到对Socket的原理有一个较清晰的认识。

通过本次的课程设计,让我学到了很多东西,对javasocket的通信有了进一步的了解和加深,也让我学会在开发系统中的一些结构理念和基本步骤。

不足之处,在于有些知识的掌握还不够牢固,不够深入,我以后将加倍努力。

由于时间的仓促,之水平有限,对于本课程设计中的缺点和不足之处,敬请老师给予批评指正!

 

十.参考文献

【1】张跃平《Java基础教程》清华大学出版社,2012年

【2】谢希仁《计算机网络第六版》电子工业出版社,2013年

【3】吴亚峰《java编程指南》人民邮电出版社,2009年

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1