利用java Socket实现双机通信.docx
- 文档编号:7004760
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:14
- 大小:393.67KB
利用java Socket实现双机通信.docx
《利用java Socket实现双机通信.docx》由会员分享,可在线阅读,更多相关《利用java Socket实现双机通信.docx(14页珍藏版)》请在冰豆网上搜索。
利用javaSocket实现双机通信
利用javaSocket实现双机通信
利用javaSocket实现双机通信
学生姓名:
xxx指导老师:
xxx
摘要Socket(套接字)是一种基于TCP/IP的编程接口。
它采用客户/服务器通信机制,使客户端和服务器端通过Socket接口在网络上实现连接和数据交换。
它提供了一系列系统调用,使用户可以方便地实现TCP和UDP等多种网络协议的通信。
它使用户可以在网络协议上工作而不必对该网络协议有非常深入的了解。
这样编写的程序可被迅速移植到任何支持Socket的网络系统中去。
本文通过主要利用JavaSocket来实现双机通信,实现一个简单的服务器,客户端聊天通信工具。
并对JavaSocket的实现进行简单的分析和讲解,通过本文以达到对Socket的原理又一个较清晰的认识。
关键词:
套接字;Socket; SocketServer类;客户机/服务器模式
1引言
为了让我们能更好的学习高级操作系统(例如Linux,Unix等),以及更好地运用强大的Linux网上功能,本课程设计以一个入门级的角度来揭示如何搭建linux下的java编程环境及用javasocket实现linux下的双机通信。
1.1课题背景及意义
Linux是一种自由和开放源码的类Unix操作系统。
目前存在着许多不同的Linux,但它们都使用了Linux内核。
Linux可安装在各种计算机硬件设备中,从手机到大型机和超级计算机。
Linux操作系统在短短几年之内得到了非常迅猛的发展,这与其良好特性是分不开的。
Linux具有开放性、多用户、多任务、设备独立性、丰富的网络服务、可靠的系统安全性、良好的可移植性、与其他Unix的兼容性以及多文件系统的支持十大特点。
这决定了Linux的自身优势以及不可替代性。
与Windows相比,虽然图形用户界面没有Windows那么人性化与直观化,但在很多方面的性能上却超过了windows。
Java是一个纯的面向对象的程序设计语言,它继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代),增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。
Java不同于一般的编译执行计算机语言和解释执行计算机语言。
它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。
与传统程序不同,Sun公司在推出Java之际就将其作为一种开放的技术。
Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。
这与微软公司所倡导的注重精英和封闭式的模式完全不同。
Java是一种跨平台的语音,它能在windows上运行,同样也可以在linux操作系统下运行。
1.2课程设计目的
本课程设计完成linux下java编程环境的搭建以及用javasocket实现linux下的双机通信。
1.3课程设计任务
本课程设计的主要任务有:
搭建linux下的java编程环境,配置linux下的网络,并用java语言编写socket代码实现双机通信。
2预先网络设置
2.1VMWare虚拟机的网络连接方式
VMWare虚拟机工作站有三种网络连接方式:
Host-only、Bridged与NAT。
Host-only连接方式:
让虚拟机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于同一网段。
最终结果是新建了一个由所有虚机与宿主主机所构成的局域网,但该局域网与宿主主机本身所处的现有局域网是相互独立的,如果不做额外路由设置,这两个局域网之间不会连通,因此新建的局域网可以认为是一个单独从属于当前宿主主机的私有网络,其成员为当前宿主主机和相关的所有虚机,这也是Host-only命名的由来。
从网络技术上相当于为宿主主机增添了一个虚拟网卡,让宿主主机变成一台双网卡主机(宿主网卡+虚拟网卡)。
同时在宿主主机后端加设一个虚拟交换机,让宿主主机和所有虚机构成另一个虚拟的局域网。
由于具备双网卡,宿主主机可同时参与两个局域网(现有的宿主局域网+新建的虚拟局域网),只不过缺省情况下两个局域网不连通。
Bridge(桥接)连接方式:
让虚拟机有与宿主机不同的各自独立IP地址,但与宿主机保持在同一网段,最终结果是所有虚机都加入宿主主机所在的局域网,这与在该局域网中添加入其他宿主主机在效果上没什么区别。
从网络技术上相当于在宿主主机前端加设了一个虚拟交换机,然后宿主主机和所有虚机共享这个交换机;或者干脆理解成在宿主主机上作点增强,使其兼具一个交换机(当然是虚拟的)功能,供该宿主主机和网段内其他虚机使用。
NAT连接方式:
虽然从表面现象看,虚机无自己的IP地址,而是共享宿主主机的IP地址,但技术本质上却是基于Host-only方式的(即,虚机还是有自己独立IP地址的,只不过实际中不投入使用),与Host-only方式一样,宿主主机成为双网卡主机,同时参与现有的宿主局域网和新建的虚拟局域网,但由于加设了一个虚拟的NAT服务器,使得虚拟局域网内的虚机在对外访问时,完全“冒用”宿主主机的IP地址,这样从外部网络来看,只能看到宿主主机,完全看不到新建的虚拟局域网。
Bridge是最简单最容易配置的一种,所以在这里选用的是Bridge连接方式。
2.2bridged连接
首先在主机的网络连接上找到本地连接并打开,选支持,点击详细信息,记录下本地连接分配到的ip信息。
如图2.1所示:
图2.1本地连接分配到的ip信息
在VMWare中的Networkconnection中勾选bridged并运行虚拟机,如图2.2所示:
图2.2VMWare的网络设置
进入Linux界面后,在系统设置-网络中做如下设置:
将eth0的ip地址设置为静态,并参照图2.1作如下设置:
ip(地址):
10.6.21.215
子网掩码:
255.255.255.0
默认网关:
10.6.21.254
如图2.3所示:
图2.3linux下的以太网静态ip设置
打开并设置linux中以太网的DNS,如图2.4所示:
图2.4linux以太网的DNS
设置好后,最后点击激活,激活该设置下的以太网。
则虚拟以太网配置完成,宿主机与虚拟机之间已经以桥接的方式连接完毕。
3jdk的安装
3.1安装
首先.给文件加上可执行权限,其次执行jdk-1_5_0_06-linux-i586-rpm.bin,最后安装jdk-1_5_0_06-linux-i586-rpm。
此时jdk已安装上,如图3.1所示:
图3.1jdk的安装
3.2配置环境
环境变量配置有三种方法(分别是:
修改/etc/profile文件,修改用户目录下的.bashrc文件,直接在shell下修改),这里我只讲我用到的修改/etc/profile文件,首先打开文件。
首先打开文件
[root@localhostjava]#vi/etc/profile
打开文件后,按I键,在文件后添加:
[Copytoclipboard][-]
CODE:
JAVA_HOME=/usr/java/jdk1.5.0_06
PATH=$JAVA_HOME/bin:
$PATH
CLASSPATH=.:
$JAVA_HOME/lib/tools.jar:
$JAVA_HOME/lib/dt.jar
exportJAVA_HOMEPATHCLASSPATH
如图3.2所示
图3.2环境变量的配置
按esc键后输入:
wq保存退出后重新登入
3.3测试配置环境
写个简单的Hello来测试一下
[root@espritjava]#viHelloWorld.java
文件中输入:
[Copytoclipboard][-]
CODE:
publicclassHelloWorld{
publicstaticvoidmain(Stringargs[]){
System.out.println("HelloWorldinLinux!
!
");
}
}
:
wq保存退出
[root@espritjava]#javacHelloWorld.java
[root@espritjava]#javaHelloWorld
shell下输出:
HelloWorldinLinux!
!
如图3.2所示
图3.3jdk环境测试
JDK安装成功了!
至此,本课程设计所需环境搭建成功。
4linux下javasocket的双机通信
4.1理论基础
4.1.1套接字通信
套接字(Socket)是网络通信的基本单元操作,又被称作端口,通常用来实现客户方向和服务器的连接。
网上的两个程序通过一个双向的通信连接实现数据的交换,在实现双向通信前链路的每一个端都建立一个Socket,通过对Socket的读/写操作实现网络通信功能。
套接字是网络通信的一个标准。
套接字分为以下三种类型:
(1)流套接字
这是最常用的套接字类型,TCP/IP协议中的TCP协议用此类接口,它提供面向连接的(建立虚电路),无差错的、发送先后顺序一致的,包长度不限和非重复的网络信包传输。
(2)数据报套接字
TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。
(3)原始数据包套接字
提供对网络下层通信协议的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或者用于协议教隐蔽的功能。
所有Socket通信程序的基本结构都是一样的,主要有创建Socket、打开连接到Socket的输入流和输出流、按照一定的协议对Socket进行读写操作。
关闭Socket这四个步骤,通过这四个步骤可以完成一般的Socket通信。
4.1.2JAVASockets编程概述:
用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类的子类的过程。
4.1.3与Socket有关的java类
1.InetAddress类:
用来保存因特网上的IP地址的类,它含有很多成员变量和方法,其中比较常用的有getLocalHost,getByName和getAllByName,利用它们都可以创建该类的对象,获得一个Java程序操纵、处理的IP地址。
例如下面的程序段可以根据主机名获取其IP地址:
try{
InetAddressremoteOP=InetAddress.getByName(“”);
}catch(UnknownHostExceptionexcpt){
System.err.println(“Unknownhost:
”+excpt);
}
2.Socket类:
用来实现TCP/IP通信的端口套接字类,所有希望通过socket来完成与远程主机进行TCP/IP连接和通信的程序,都必须创建一个socket类的对象。
这个类对象的作用首先是根据远程主机的IP地址和端口号在本地主机创建一个与远程主机的联接;其次,在连接建立后,本地主机程序就可以使用这个类对象提供的输入/输出通道与远程主机实现通信。
当一个socket被创建时,它所指定的连接也将同时被建立并打开,若连接成功,调用这个socket对象的有关方法就可以实现与远程主机的读写通信操作;若连接失败,则构造函数会抛出例外,表示没有成功创建对象。
Socket对象的方法getInputStream()和getOutputStream()用来实现程序通过Socket对远程方的读写。
调用getInputStream()方法返回一个抽象的getInputStream对象,可以从远程方读取二进制数据;调用getOutputStream()方法可以返回一个抽象的getOutputStream对象,实现远程方的写入操作。
由于getInputStream和getOutputStream都只是对二进制的原始数据的读写,而不能实现对复杂数据结构的直接操作,所以在实际应用中一般要先对getInputStream()和getOutputStream()方法返回的输入/输出流作加工变换后再使用。
当与Socket的通信结束时,可用调用close()方法来关闭连接。
另外,调用getLocalPort()和getInetAddress()方法还可获得Socket连接的服务器的有关服务器端口号和IP地址等有关信息。
3.ServerSocket类
它是java用来实现TCP/IP通信服务器端程序的主要机制。
当一个ServerSocket对象被创建时,程序在本机的指定端口处提供服务并开始监听可能的来自客户端的服务请求。
当一个客户请求连接并被接受时,服务器程序将创建一个Socket对象与远程的客户机相连,实现读写通信操作。
该类的accept()方法用来等待并接受客户机的一个连接,当这个方法被调用时,服务器进程或线程将处于阻塞状态,直至它监听到有一个客户进程提出服务请求,并与之成功连接,这时方法将返回一个新创建的服务器端的Socket对象,这个对象已经与远程客户机连接成功,并可以与客户机的Socket实现读写操作。
若服务器可同时提供的连接数超过一个,则服务器程序应该创建一个新的线程来完成与客户机的通信,而保留原有监听线程继续准备接受其它客户机的服务请求。
当ServerSocket对象要结束它在特定端口上提供的服务时,可以调用close()方法实现。
4.2客户机/服务器通信的实现
4.2.1服务器端的开发
服务器端实现对主机某个端口不断监听,并不断接受客户端的连接请求,当受到连接后响应客户的的信息并向客户端完成一次服务。
4.2.2客户端的开发
客户端用于对某个固定IP的服务器进行连接,接着向服务器发送一条消息,最后接受服务器的返回消息并打印。
4.3程序的实现
4.3.1服务器端的实现
(1)服务器端用一个类Server来实现,创建一个ServerSocket类的对象,实现对端口1234的不断监听,直到受到客户端的信息
(2)代码如下:
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
import.ServerSocket;
import.Socket;
publicclassServer{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
//创建服务器端对象
ServerSocketss=newServerSocket(1234);
System.out.println("启动服务器....");
//等待客户的请求
Socketclient=ss.accept();
System.out.println("客户端:
"+client.getInetAddress().getHostName()+"连接服务器成功!
");
//进行数据交换
InputStreamis=client.getInputStream();
OutputStreamos=client.getOutputStream();
StringclientStr="";
while(!
clientStr.equalsIgnoreCase("quit")){
byte[]data=newbyte[1024];
is.read(data);
clientStr=newString(data);
System.out.println("[client]:
"+clientStr);
if(clientStr.trim().equals("quit")){
os.write("byebye".getBytes());
}elseif(clientStr.indexOf("server")>=0)
{
os.write(clientStr.replaceFirst("server","client").getBytes());
}
else
{
os.write(clientStr.concat("server").getBytes());
}
}
client.close();
//关闭相应的客户端
}catch(IOExceptione){
System.out.println("端口无效");
}
}
}
(3)运行结果如图4.1
图4.1服务器运行结果
4.3.2客服端的实现
(1)客户端主要用Client类来实现对服务器端的连接功能,创建一个Socket对象实现对服务器的连接。
(2)代码如下:
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
import.Socket;
import.UnknownHostException;
/**
*一个连接多次通信
*Client.java
*/
publicclassClient{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
//step1:
创建客户端连接服务器的IP地址和相应的通信端口
Socketsocket=newSocket("192.168.138.5",1234);
System.out.println("连接服务器成功....");
//step2:
使用io进行数据交换
OutputStreamos=socket.getOutputStream();
InputStreamis=socket.getInputStream();
Stringuser="";
while(!
user.equalsIgnoreCase("quit")){
System.out.print("输入:
");
BufferedReaderbReader=newBufferedReader(newInputStreamReader(System.in));
user=bReader.readLine();
//向服务器发出请求
os.write(user.getBytes());
//接收服务器的相应
byte[]data=newbyte[1024];
is.read(data);
System.out.println("[server]说:
"+newString(data));
}
//step3:
关闭
socket.close();
}catch(UnknownHostExceptione){
System.out.println("请检验IP地址");
}catch(IOExceptione){
System.out.println("访问服务器失败");
}
}
}
(3)运行结果如图4.2
图4.2客服端运行结果
结束语
经过几天的不懈努力,我终于完成了这个课程设计。
大部分设计内容均由自己一人独立完成。
在遇到不懂的问题时我积极上网查阅资料以及查阅书本并请教同学,期间也叫同学帮忙搭建了一个samba服务器,最后终于克服了很多困难。
说实话,我开始选的是linux下新闻发布系统的实现,但我考虑到搭建环境可能很难(需要jdk,tomcat,sql数据库,还要个开发工具myeclipse),主要是相互之间也得不支持,时间上又来不及,宿舍里网速也很慢,软件很难下载过来,所以最后我改成了现在这个题目,虽然有点遗憾没能把linux下jsp开发的整套环境搭建起来,但我还是觉得自己收获了很多。
Javasocket一直算是我的一个弱项吧,通过这次课程设计我又对javasocket有了一个新的认识。
而且对linux熟悉了很多。
总的来说这次课程设计让我学到了很多东西,java方面的,还有linux方面的,虽然之总遇到了很多问题,留下了一些遗憾,但在以后的日子里,我会把这些遗憾解决掉,把jsp开发环境在linux上搭建出来。
在此感谢指导老师周老师,及各位在此次课程设计当中帮过我忙的同学,以及linux课程授业老师。
参考文献
[1]文东戈.Linux操作系统使用教程[M].北京:
清华大学出版社,2010.166-175.
[2]谢希仁.网络课程设计[M].北京:
电子工业出版社,2006.210-216.
[4]埃克尔(美).java编程思想(第四版).北京:
机械工业出版社,2007.548-560.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用java Socket实现双机通信 利用 java Socket 实现 双机 通信
![提示](https://static.bdocx.com/images/bang_tan.gif)