Java 套接字(Socket)

    |     2015年3月29日   |   Java网络编程   |     0 条评论   |    1220

在客户机/服务器工作模式中,在Server端,要准备接受多个Client端计算机的通信。为此,除用IP地址标识Internet上的计算机之外,另还引入端口号,用端口号标识正在Server端后台服务的线程。端口号与IP地址的组合称为网络套接字(socket)。

Java语言在实现C/S模式中,套接字分为两类:
在Server端,ServerSocket类支持底层的网络通信;
在Client端,Socket类支持网络的底层通信。
Server机通过端口(总线I/O地址)提供面向Client机的服务;Server机在它的几个不同端口分别同时提供几种不同的服务。Client接入Server的某一端口,通过这个端口提请Server机为其服务。规定:端口号0~1023供系统专用。例如,HTTP协议在端口80,telnet协议在端口23。端口1024~65535供应用程序使用。

当Client程序和Server程序需要通信时,可以用Socket类建立套接字连接。套接字连接可想象为一个电话呼叫:最初是Client程序建立呼叫,Server程序监听;呼叫完成后,任何一方都可以随时讲话。

双方实现通信有流式socket和数据报式socket两种可选方式:
流式socket是有连接的通信,即TCP(Transmission Control Protocol):每次通信前建立连接,通信结束后断开连接。特点是可以保证传输的正确性、可靠性。
数据报式socket是无连接的通信,即UDP(User Datagram Protocol):将欲传输的数据分成 小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证。

流式socket在Client程序和Server程序间建立通信的通道。每个socket可以进行读和写两种操作。对于任一端,与对方的通信会话过程是:
建立socket连接,获得输入/输出流,读数据/写数据,通信完成后关闭socket(拆除连接)。

利用socket的构造方法,可以在客户端建立到服务器的套接字对象:
    Socket(String host,int port):host是服务器的IP地址,port是端口号,这些是预先约定的。
例如,代码:
   

 try{
        Socket mySocket = new Socket(“http://www.warmtel.com” ,1860);
    }catch(IOException e){}

然后,用getInputStream()方法获得输入流,用这个输入流读取服务器放入“线路”的信息;用getOutputStream()方法获得输出流,用这个输出流将信息写入“线路”。

利用ServerSocket的构造方法可以在服务器建立接受客户套接字的服务器套接字对象:
    ServerSocket(int port):指定端口号,创建一个ServerSocket对象。端口号port要与客户呼叫的端口号相同。为此,用以下形式代码:
   

 try{
        ServerSocket serverSocket = new ServerSocket(1860);
    }catch(IOException e){}

服务器端程序在指定的端口监听,当收到Client程序发出的服务请求时,创建一个套接字对象与该端口对应的Client程序通信。例如,执行上述建立服务器套接字对象的代码,确立了对象serverSocket后,就可能它使用accept()方法,得到Socket对象,接收Client程序来自套接字mySocket的信息。如以下代码所示:
  

  try{
        Socket sc = serverSocket.accept();//ac是一个Socket对象
    }catch(IOException e){}

要撤销服务,可以关闭Socket对象sc:
   

 sc.close();

【例 13-3】C/S模式中的Client端应用程序。这是一个Client端的流式Socket通信的简单实例,代码说明Client端程序的编写方法。例中,Client程序向服务器主机的端口4441提出请求,连接建立后完成对服务器的读写。

import java.io.*;
import java.net.*;
public class Client{
    public static void main(String args[]){
        String s = null;Socket mySocket;
        DataInputStream in = null;DataOutputStream out = null;
        try{
            mySocket = new Socket(“localhost”,4441);
            in = new DataInputStream(mySocket.getInputStream());
            out = new DataOutputStream(mySocket.getOutputStream());
            out.writeUTF(“good server!”);
            while(true){
                s = in.readUTF();
                if(s==null)
                   break;
                else
                    System.out.println(s);
            }
            mySocket.close();
        }catch(IOException e){
            System.out.println(“can’t connect”);
        }
    }
}

【例 13-4】与例10.3 Client端应用程序对应的Server端应用程序。程序在4441端口监听,当检测到有客户机请求时,产生一个内为“客户,你好,我是服务器”的字符串输出到客户端。

import java.io.*;import java.net.*;
public class Server{
    public static void main(String args[]){
        ServerSocket server = null;
        Socket you = null;String s = null;
        DataOutputStream out = null;
        DataInputStream in = null;
        try{
            server = new ServerSocket(4441);
        }catch(IOException e1){
            system.out.println(“ERROR:” +e1);
        }
        try{
            you = server.accept();
            in = new DataInputStream(you.getInputStream());
            out = new DataOutputStream(you. getOutputStream());
            while(true){
                s = in.readUTF();
                if(s!=null) break;
            }
            out.writeUTF(“客户,你好,我是服务器”);
            out.close();
        }
        catch(IOException e){System.out.println(“ERROR:”+e);}
    }
}

为了充分发挥计算机的平行工作能力,可以把套接字连接工作让一个线程完成。当客户端要请求服务器给予服务,或当服务器端接收到一个客户的服务请求,就启动一个专门完成信息通信的线程,在该线程中创建输入输出流,并完成客户端与服务器端的信息交流。

转载请注明来源:Java 套接字(Socket)
回复 取消