所谓Socket编程是指基于TCP协议的网络编程。TCP是一种基于连接的协议,可以在计算机之间提供可靠的数据传输。

   通过TCP进行通信的双方通常称为服务器端和客户端。

   服务器端实现步骤:

  (1)创建ServerSocket对象,并对服务器端注册连接的端口和允许连接的最大客户数。

  (2)通过ServerSocket对象的accept方法来监听客户都按的连接请求。当有客户端与该服务器连接时,返回Socket对象。并通过该Socket对象与客户端进行通信。

  (3)调用Socket对象的getInputStream和getOutputStream方法获得Socket对应的输入输出流。

  (4)通过输入输出流与客户端进行数据通信。

  (5)通信结束后,关闭输入流,输出流,Socket。

   客户端实现步骤:

  (1)创建Socket对象,并确定要连接的服务器地址和端口。

  (2)获得Socket对象的输入输出流。

  (3)通过输入输出流与服务器进行通信。

  (4)通信完毕后,关闭输入输出流和Socket。

下面用代码来解释下这个过程:

1.单线程实现

服务器端:

  1. ServerSocket server = new ServerSocket(3000); 
  2. System.out.println("启动..."); 
  3. while(true){ 
  4.     Socket incoming = server.accept(); 
  5.     BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));   
  6.     PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);  
  7.     String str = in.readLine(); 
  8.     do
  9.      System.out.println("收到信息:"+str); 
  10.      str = in.readLine(); 
  11.     }while(!"q".equals(str)); 
  12.     System.out.println("连接结束"); 

客户端:

  1. Socket socket = new Socket("localhost",3000); 
  2. System.out.println("启动..."); 
  3. while(true){ 
  4. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
  5.    PrintWriter out = new PrintWriter(socket.getOutputStream(),true);  
  6.    System.out.println("请输入内容:"); 
  7.    Scanner readsysoutin = new Scanner(System.in); 
  8.    String s = readsysoutin.nextLine(); 
  9.    if("exit".equals(s)){ 
  10.        break
  11.    } 
  12.    out.println(s); 
  13.    out.flush(); 
  14. }
     

2.多线程实现

服务器端:

  1. public static void main(String[] args) throws IOException{ 
  2.     ServerSocket server = new ServerSocket(3000); 
  3.     System.out.println("启动..."); 
  4.     while(true){ 
  5.         Socket socket = server.accept(); 
  6.         invoke(socket); 
  7.     } 
  8.      
  9. private static void invoke(final Socket client)throws IOException{ 
  10.     new Thread(new Runnable() {   
  11.         public void run() {   
  12.            BufferedReader in = null;   
  13.            PrintWriter out = null;   
  14.            try {   
  15.                  in = new BufferedReader(new InputStreamReader(client.getInputStream()));   
  16.                  out = new PrintWriter(client.getOutputStream());   
  17.                  while (true) {   
  18.                      String msg = in.readLine();   
  19.                      System.out.println(msg);   
  20.                      if (msg.equals("q")) {   
  21.                          break;   
  22.                      }   
  23.                   }   
  24.              } catch(IOException ex) {   
  25.                  ex.printStackTrace();   
  26.              } finally {   
  27.                     try {   
  28.                         in.close();   
  29.                     } catch (Exception e) {}   
  30.                     try {   
  31.                         out.close();   
  32.                     } catch (Exception e) {}   
  33.                     try {   
  34.                         client.close();   
  35.                     } catch (Exception e) {}   
  36.              }   
  37.           }   
  38.      }).start();  

客户端不用修改。

3.Socket还可以发送HTTP请求,主要是拼出HTTP请求的格式并发送信息。这里不做详细的整理。