TCP/IP socket编程

先来介绍下网络协议:  
    TCP/IP  
        Transmission Control Protocol 传输控制协议  
        Internet Protocol 互联网协议  
    UDP  
        User Datagram Protocol 用户数据协议  

连接协议:  
    分为:  
    面向连接协议: Connection Oriented Protocol  
    非连接协议: Connectionless Protocol  

    1).面向连接协议是指两台电脑在传输数据前,先会建立一个专属的连接。就如电信局的交换机会为打电话双方提供专属连接一样。  
    Internet上的面向连接协议就是 TCP/IP  
    特点:确认回应;分组序号;流量控制。  
    TCP/IP属于可靠性传输,适合不容许有传输错误的网络程序设计使用  

    2).非连接协议:无专属连接,无分组,容错,距离短,可同时对多台电脑进行数据传输  
    Internet上的非连接协议就是 UDP  

    TCP在网络通信上有极强的生命力,例如远程连接( Telnet )和文件传输( FTP )都需要不定长度的数据被可靠地传输。相比之下 UDP 操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server 应用程序。  


Socket 是程序与网络间的一种接口,大部分网络应用程序都是点对点的,所谓点就是服务器端和客户端所执行的程序。 Socket 是用来接收和传送分组的一个端点。  

java Socket 编程要用到 java.net 包,最常用的是 net 包下的 6 个类: InetAddress( 互联网协议  (IP)  地址 ) 类,Socket( 套接字 ) 类, ServerSocket( 套接字服务器 ) 类, DatagramSocket( 发送和接收数据报包的套接字 )  类,DatagramPacket( 数据报包 ) 类, MulticastSocket( 多播数据报套接字类用于发送和接收  IP  多播包 ) 类,其中InetAddress  Socket  ServerSocket 类是属于 TCP 面向连接协议, DatagramSocket 、  DatagramPacket MulticastSocket 类则属于 UDP 非连接协议的传送类。 

——From: http://cuishen.iteye.com/blog/242842

 

TCP 通信模型

TCP/IP socket编程_第1张图片

Socket模型

TCP/IP socket编程_第2张图片

 

示例代码:

UdpServer.java

[java]  view plain copy
  1. package me.bym.udp;  
  2. import java.io.IOException;  
  3. import java.net.DatagramPacket;  
  4. import java.net.DatagramSocket;  
  5. import java.net.SocketException;  
  6. public class UdpServer {  
  7.     public static void main(String[] args) {  
  8.         // 声明UPD socket,即DatagramSocket  
  9.         DatagramSocket socket = null;  
  10.         try {  
  11.             // 产生DatagramSocket对象,制定监听端口  
  12.             socket = new DatagramSocket(1234);  
  13.             // 设置消息读取缓冲区  
  14.             byte data[] = new byte[512];  
  15.             // 声明和定义UDP数据包,内容是消息缓冲区的内容  
  16.             DatagramPacket packet = new DatagramPacket(data, data.length);  
  17.             // 调用阻塞方法receiver接受客户端发来的内容存放到消息缓冲区packet中  
  18.             socket.receive(packet);  
  19.             // 打印消息  
  20.             String msg = new String(packet.getData(), packet.getOffset(),  
  21.                     packet.getLength());  
  22.             System.out.println(msg);  
  23.         } catch (SocketException e) {  
  24.             // TODO Auto-generated catch block  
  25.             e.printStackTrace();  
  26.         } catch (IOException e) {  
  27.             // TODO Auto-generated catch block  
  28.             e.printStackTrace();  
  29.         } finally {  
  30.             // 关闭socket  
  31.             socket.close();  
  32.         }  
  33.     }  
  34. }  

UdpClient.java

[java]  view plain copy
  1. package me.bym.udp;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStreamReader;  
  5. import java.net.DatagramPacket;  
  6. import java.net.DatagramSocket;  
  7. import java.net.InetAddress;  
  8. import java.net.SocketException;  
  9. public class UdpClient {  
  10.     public static void main(String[] args) {  
  11.         DatagramSocket socket = null;  
  12.         String msg = null;  
  13.         try {  
  14.             socket = new DatagramSocket();  
  15.             // 从标准输入(键盘)读取数据  
  16.             BufferedReader reader = new BufferedReader(new InputStreamReader(  
  17.                     System.in));  
  18.             while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {  
  19.                 // 产生一个InetAddress,内容是服务器端的IP  
  20.                 InetAddress serverAddress = InetAddress.getByName("127.0.0.1");  
  21.                 // 构造要发送消息的数据报, 并制定服务器监听的端口  
  22.                 DatagramPacket packet = new DatagramPacket(msg.getBytes(),  
  23.                         msg.getBytes().length, serverAddress, 1234);  
  24.                 // 发送数据报  
  25.                 socket.send(packet);  
  26.             }  
  27.         } catch (SocketException e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         } catch (IOException e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         } finally {  
  34.             socket.close();  
  35.         }  
  36.     }  
  37. }  

 

TcpServer.java

[java]  view plain copy
  1. package me.bym.tcp;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.net.ServerSocket;  
  5. import java.net.Socket;  
  6. public class TcpServer {  
  7.     public static void main(String[] args) {  
  8.         // 声明一个服务器端socket  
  9.         ServerSocket serverSocket = null;  
  10.         // 声明一个socket来接受客户端连接  
  11.         Socket socket = null;  
  12.         try {  
  13.             int temp;  
  14.             // 定义服务器端socket并指定监听端口  
  15.             serverSocket = new ServerSocket(5937);  
  16.             // 调用阻塞式方法来获取客户端连接的socket  
  17.             socket = serverSocket.accept();  
  18.             // 获取客户端socket的输入流  
  19.             InputStream inputStream = socket.getInputStream();  
  20.             // 读取客户端socket的输入流的内容并输出  
  21.             byte[] buffer = new byte[512];  
  22.             while ((temp = inputStream.read(buffer)) != -1) {  
  23.                 System.out.println(new String(buffer, 0, temp));  
  24.             }  
  25.         } catch (IOException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } finally {  
  29.             try {  
  30.                 socket.close();  
  31.                 serverSocket.close();  
  32.             } catch (IOException e) {  
  33.                 // TODO Auto-generated catch block  
  34.                 e.printStackTrace();  
  35.             }  
  36.         }  
  37.     }  
  38. }  

TcpClient.java

[java]  view plain copy
  1. package me.bym.tcp;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStreamReader;  
  5. import java.io.OutputStream;  
  6. import java.net.Socket;  
  7. import java.net.UnknownHostException;  
  8. public class TcpClient {  
  9.     public static void main(String[] args) {  
  10.         // 声明一个socket  
  11.         Socket socket = null;  
  12.         try {  
  13.             String msg = null;  
  14.             // 产生socket对象,制定服务器地址和服务器监听的端口号  
  15.             socket = new Socket("127.0.0.1"5937);  
  16.             // 从标准输入(键盘)读取内容,获取socket的输出流,将读取到的内容放入输出流中  
  17.             BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));  
  18.             OutputStream outputStream = socket.getOutputStream();  
  19.             while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {  
  20.                 outputStream.write(msg.getBytes());  
  21.             }  
  22.         } catch (UnknownHostException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         } catch (IOException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } finally {  
  29.             try {  
  30.                 socket.close();  
  31.             } catch (IOException e) {  
  32.                 // TODO Auto-generated catch block  
  33.                 e.printStackTrace();  
  34.             }  
  35.         }  
  36.     }  
  37.       
  38. }  

你可能感兴趣的:(TCP/IP socket编程)