分享

java socket编程指南

 zhanghuan 2007-11-12

一篇不错的介绍Java Socket编程的文章

事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的Api来完成这些工作,Socket就是其中之一。 ZR&DfsFv  
0pW[Gi l  
对 于Java而言。这些Api存在与Java.net这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简 单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数据的通 讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。基于这个简单的模型,就可以进入网络编程。 JM;z(]#  
KNVtwpnn#  
Java 对这个模型的支持有很多种Api。而这里我只想介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关 提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持。事实上当你创建该类的一个实力对象并提供一个端口资源你就建 立了一个固定位置可以让其他计算机来访问你。 4:mw.qE‘  
.C%AAX?  
ServerSocket server=new (5197SE;  
Bc&i$I$K_  
ServerSocket(6789); 1=P+( r  
X)?e%=~++  
这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。 `hgx\!-z  
c K@Pqmms.  
好了。我们有了固定位置。现在所需要的就是一根连接线了。该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持。只要客户方创建一个Socket的实例对象进行支持就可以了。 ~HS a$  
XUR:#zn  
Socket client=new )63A K+93I  
y5UL B(=?{  
Socket(InetAddress.getLocalHost(),5678); I%U #Lg  
6=43{?d  
客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。 yq&!v9z  
dcsGac(  
好了,上面的方法基本可以建立一条连线让两台计算机相互交流了。可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。 Vh$D@y0.  
S >,~"i}E  
否则数据的交互还是依赖于IO操作的。所以你也必须导入Java。io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。 eA:pL  
{.BFNV?`\  
Y}Jr[#`UEq  
BufferedReader in=new kXhZjpI2j  
9QH"#EK.  
BufferedReader(new InputStreamReader o"^8Yi}  
o?p-&lvP  
(server.getInputStream())); *sDt KyMT  
U4wann"x  
PrintWriter out=new @9z$<}iiT  
OpAJ}LD  
PrintWriter(server.getOutputStream()); 4vBd`Le  
~!l=4>  
vBT*+UzZ  
上 面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作。而原始的字节流来源于Socket的两个方法,getInputStream()和 getOutputStream()方,分别用来得到输入和输出。那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了服务 方: pBEZI8SQ  
s`8DJ\vBZ  
mV$P }Mk  
import Java。io。*; "ZS-~IY  
RIBe‘s%R  
import Java。net。*; 1dfB[yO:  
{b-CrQr  
public class MyServer Y}y2tph"  
;+rDo  
{ hRsug*  
$_:7au%X‘?  
public static void main $dqT$n+p0^  
E$KKX-7zVm  
(String[] args) throws IOException .HFaXp\0nN  
uL%U k <-$  
{ J‘mH5x|  
ServerSocket server=new A‘-n)nUx  
ServerSocket(5678); vf(56  
Socket client=server.accept(); }<s`U~ jR  
BufferedReader V:|4 )XM  
in=new BufferedReader(new PdZ)p*%J  
InputStreamReader 4y]A4*#  
(client.getInputStream())); -{%  
PrintWriter out=new MF;4*R  
PrintWriter(client.getOutputStream()); >]‘dtDB%  
while(true) F|!dr&0Sc  
{ WBx+zxf{  
String str=in.readLine(); 3:VP`W  
System.out.println(str); =`8T` Wj  
out.println("has receive..."); Ea1`c`t  
out.flush(); cfd@lw1‘  
if(str.equals("end")) <s3sT,A$  
break; dm]uD-  
} gGv2 dl5  
client。close(); m?$Pju@%P  
} E ^<{6R]w  
} r#|Pli \u\  
[SDF z`/  
这个程序的主要目的在于服务器不断接收客户机所写入的信息只到。客户机发送"End"字符串就退出程序。并且服务器也会做出"Receive"为回应。告知客户机已接收到消息。客户机代码: Rz]? !~Z~  
‘YQ=nygG*  
OGXV=_]  
import Java.net.*; FFc.cr{  
Sr $"2F‘  
import Java.io.*; *s+AXE  
1:TALD,  
public class Client{ ;;TUSr RT  
static Socket server; K^?gF  
Mn`1t=Pr  
public static void BIL%" }  
main(String[] args) ^8CD2D$  
throws Exception v<N?P0W$  
{ /0&Q#?*   
server=new Socket P_W(T  
(InetAddress.getLocalHost(),5678); &T(VBOG!p  
BufferedReader in=new BufferedReader(new ]~@0&JGq  
InputStreamReader(server。getInputStream())); ZV.P :_y}  
PrintWriter out=new pD>W4L  
PrintWriter(server.getOutputStream()); +F{BJ.K  
BufferedReader wt=new BufferedReader(new y|ya/?k  
InputStreamReader(System.in)); 1 8q,  
while(true) elUX;{eA{  
{ U!+$fKJb  
  String str=wt.readLine(); fTB+Z"  
  out.println(str); {hF<nLZ3t  
  out.flush(); _~ G(W?  
  if(str.equals("end")) <@ BHzI#u  
  { :S?[ ooq  
  break; %:N(g$b‘,2  
  } kRDA @U3#R  
  System.out.println(in.readLine()); Ps+hAC19  
} y Q=!1OyIO  
server.close(); HUri/(+  
} Uf*F=WdX#  
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多