利用Socket实现双机通讯Word格式文档下载.docx
- 文档编号:21858286
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:98.63KB
利用Socket实现双机通讯Word格式文档下载.docx
《利用Socket实现双机通讯Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《利用Socket实现双机通讯Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
(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,"
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;
import.ServerSocket;
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,"
BufferedReaderbr=newBufferedReader(isr);
Scannerscanner=newScanner(System.in);
OutputStreamos=s.getOutputStream();
OutputStreamWriterosw=newOutputStreamWriter(os,"
BufferedWriterbw=newBufferedWriter(osw);
Stringmsg=br.readLine();
while(!
.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年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 Socket 实现 双机 通讯