一篇介绍 Java Socket 编程的经典文章

12年前
事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。Java SDK提供一些相对简单的Api来完成这些工作,Socket就是其中之一。  

  对于Java而言。这些Api存在与Java.net这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模 型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数 据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。基于这个简单的模型,就可以进入网络编程。  

  Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程接口。首先我 们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持。事实上当你创建该类的一个实力对象并提供一个端 口资源你就建立了一个固定位置可以让其他计算机来访问你。  

ServerSocket server=new ServerSocket(6789);  

  这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。  

  好了。我们有了固定位置。现在所需要的就是一根连接线了。该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持。只要客户方创建一个Socket的实例对象进行支持就可以了。  

Socket client=new Socket(InetAddress.getLocalHost(),5678);  

  客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。  

  好了,上面的方法基本可以建立一条连线让两台计算机相互交流了。可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。  

  否则数据的交互还是依赖于IO操作的。所以你也必须导入Java.io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。  

BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));  

PrintWriter out=new PrintWriter(server.getOutputStream());  

  上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作。而原始的字节流来源于Socket的两个方 法,getInputStream()和getOutputStream()方,分别用来得到输入和输出。那么现在有了基本的模型和基本的操作工具,我们 可以做一个简单的Socket例程了服务方:  
import Java。io。*;   import Java。net。*;   public class MyServer   {   public static void main   (String[] args) throws IOException   {   ServerSocket server=new   ServerSocket(5678);   Socket client=server.accept();   BufferedReader   in=new BufferedReader(new   InputStreamReader   (client.getInputStream()));   PrintWriter out=new   PrintWriter(client.getOutputStream());   while(true)   {   String str=in.readLine();   System.out.println(str);   out.println("has receive...");   out.flush();   if(str.equals("end"))   break;   }   client。close();   }   } 

  

这个程序的主要目的在于服务器不断接收客户机所写入的信息只到。客户机发送"End"字符串就退出程序。并且服务器也会做出"Receive"为回应。告知客户机已接收到消息。客户机代码:  
import Java.net.*;   import Java.io.*;   public class Client{   static Socket server;   public static void   main(String[] args)   throws Exception   {   server=new Socket   (InetAddress.getLocalHost(),5678);   BufferedReader in=new BufferedReader(new   InputStreamReader(server。getInputStream()));   PrintWriter out=new   PrintWriter(server.getOutputStream());   BufferedReader wt=new BufferedReader(new   InputStreamReader(System.in));   while(true)   {     String str=wt.readLine();     out.println(str);     out.flush();     if(str.equals("end"))     {     break;     }     System.out.println(in.readLine());   }   server.close();   }   }