javasocket编程方案.docx
《javasocket编程方案.docx》由会员分享,可在线阅读,更多相关《javasocket编程方案.docx(13页珍藏版)》请在冰豆网上搜索。
javasocket编程方案
javasocket编程方案
一、网络编程中两个主要的问题
一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
二、两类传输协议:
TCP;UDP
TCP是一种面向连接的保证可靠传输的协议。
通过TCP>议传输,得到的是一个顺序的无差错的数据流。
发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是serversocket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
比较:
UDP1每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
2,UDF传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
3,UDP是一个不可靠的协议,发送方所
发送的数据报并不一定以相同的次序到达接收方
TCP1,面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接
时间。
2,TCP传输数据大小限制,一旦连接
建立起来,双方的socket就可以按统一的格式传输大的数据。
3,TCP是一个可靠的协议,它确保
接收方完全正确地获取发送方所发送的全部数据。
应用:
1,TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP都需要不定长度的数据被可靠地传输。
但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽。
2,UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。
例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
三、基于Socket的java网络编程
1,什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现客户方和服务方的连接。
Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。
在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
2,Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向
Server端发出Connect(连接)请求,Server端向Client端发回
Accept(接受)消息。
一个连接就建立起来了。
Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1)创建Socket;
(2)打开连接到Socket的输入/出流;
(3)按照一定的协议对Socket进行读/写操作;
(4)关闭Socket.
3,创建Socket
java在包中提供了两个类Socket和ServerSocket,分别用来表
示双向连接的客户端和服务端。
这是两个封装得非常好的类,使用很
方便。
其构造方法如下:
Socket(InetAddressaddress,intport);
Socket(InetAddressaddress,intport,booleanstream);
Socket(Stringhost,intprot);
Socket(Stringhost,intprot,booleanstream);
Socket(SocketImplimpl)
Socket(Stringhost,intport,InetAddresslocalAddr,
intlocalPort)
Socket(InetAddressaddress,intport,InetAddress
localAddr,intlocalPort)
ServerSocket(intport);
ServerSocket(intport,intbacklog);
ServerSocket(intport,intbacklog,InetAddress
bindAddr)
其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可以用来创建Socket。
例如:
Socketclient=newSocket("",1223);
ServerSocketserver=newServerSocket(1223);
注意,在选择端口时,必须小心。
每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。
0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23,所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。
所以在创建Socket或ServerSocket是必须捕获或抛出例外。
4,简单的Client/Server程序
1.客户端程序
import.*;
import.*;
publicclassTalkClient{
publicstaticvoidmain(Stringargs[]){
try{
Socketsocket=newSocket("",4700);
服务器端程序
import.*;
import.*;
importpublicclassTalkServer{
publicstaticvoidmain(Stringargs[]){
try{
ServerSocketserver=null;
try{
server=newServerSocket(4700);
+e);
tart();
tart();
}
}
1.socket的Util辅助类
packagesterning;
import.*;
import.*;
publicclassClientSocket{
privateStringip;
privateintport;
privateSocketsocket=null;
DataOutputStreamout=null;
DataInputStreamgetMessageStream=null;
publicClientSocket(Stringip,intport){
=ip;
=port;
}
//
/**
创建socket连接
();
if(socket!
=null)
();
throwe;
}
finally{
}
}
publicvoidsendMessage(StringsendMessage)throws
Exception{
try{
out=newDataOutputStream());
if("Windows")){
(0x1);
();
return;
}
if("Unix")){
(0x2);
();
return;
}
if("Linux")){
(0x3);
();
}
else{
(sendMessage);
();
catch(Exceptione){
();
if(out!
=null)
();
throwe;
}
finally{
}
}
publicDataInputStreamgetMessageStream()throwsException{
try{
getMessageStream=newDataInputStream(new
BufferedInputStream()));
returngetMessageStream;
}
catch(Exceptione){
();
if(getMessageStream!
=null)
();
throwe;
}
finally{
}
}
publicvoidshutDownConnection(){
try{
if(out!
=null)
();
if(getMessageStream!
=null)
();
if(socket!
=null)
();
}
catch(Exceptione){
}
}
}
2.客户端
packagesterning;
importclassClientTest{
设置成服务器IP
privateClientSocketcs=null;
privateStringip="localhost";//privateintport=8821;
privateStringsendMessage="Windwos";
publicClientTest(){
try{
if(createConnection()){
sendMessage();
getMessage();
}
}
catch(Exceptionex){
();
privatebooleancreateConnection(){
cs=newClientSocket(ip,port);
try{
();
"连接服务器成功!
");
returntrue;
}
catch(Exceptione){
"连接服务器失败!
");
returnfalse;
}
}
privatevoidsendMessage(){if(cs==null)
return;
try{
(sendMessage);
catch(Exceptione){
"发送消息失败!
");
}
}
privatevoidgetMessage(){
if(cs==null)
return;
DataInputStreaminputStream=null;try{
inputStream=();
}
catch(Exceptione){
"接收消息缓存错误");
return;
try{
//本地保存路径,文件名会自动从服务器端继承而来。
StringsavePath="E:
\";
intbufferSize=8192;
byte[]buf=newbyte[bufferSize];
intpassedlen=0;
longlen=0;
savePath+=();
DataOutputStreamfileOut=newDataOutputStream(newBufferedOutputStream(NewBufferedOutputStream(new
FileOutputStream(savePath))));
len=();
"文件的长度为:
"+len+");
"开始接收文件!
");
while(true){
intread=0;
if(inputStream!
=null){
read=(buf);
}
passedlen+=read;
if(read==-1){
break;
}
"文件接收了"+(passedlen*100/len)+"%");
(buf,0,read);
}
"接收完成,文件存为"+savePath+");
();
}catch(Exceptione){
I!
接收消息错误");
return;
}
}
publicstaticvoidmain(Stringarg[]){
newClientTest();
}
}
7,服务器配置
IBMSystemX3200M3万万)
基本参数
产品类别塔式
产品结构5U
处理器
CPU类型Intel至强3400
CPU型号XeonX3430
CPU频率
智能加速主
频
标配CPL数
1颗
量
最大CPL数
1颗
量
制程工艺45nm
三级缓存8MB
总线规格DMIs
CPU核心四核(Lynnfield)
CPU线程数
兀线程
主板
扩展槽
2X全长PCIex8第二代
1X全长PCIex1
2X全长PCI(32位/33MHz)
1XPCIex4(用于RAID-0,RAID-1控制器)
内存
内存类型
DDR3
内存容量
2GB
内存插槽数
量
6
最大内存容
量
32GB
存储
标配硬盘容
量
标配不提供
最大硬盘容
量
4TB
内部硬盘架
数
最大支持4块英寸SATA硬盘
热插拔盘位
支持热插拔
RAID模式
RaidBR-10il
光驱
DVD-ROM
网络
网络控制
器
集成双千兆网卡
显示系统
显示芯片MatroxG200eV,16MB显存
接口类型
RJ-45
4XUSB(后置)
标准接口1X并口
2X串口
Video
管理及其他
带IPMI和SerialoverLAN(SOL的集成管理模块
系统管理
系统支持
(IMM,IBMSystemsDirector,AlertStandardFormat,IBMServerGuide,硬件虚拟介质密钥(用于可选远程在线支持)
MicrosoftWindowsServer2008企业版,x64企业
版,标准版,x64标准版,数据中心版,X64数据中心版
WindowsSmallBusinessServer2008
RedHatLinux
SUSELinux
电源性能
电源数量
1个
电源功率
纠错400W
外观特征
产品尺寸
XX
产品重量
保修信息
保修政策
全球联保,享受三包服务
质保时间
3年
质保备注
3年部件,3年人工,3年现场