先来介绍下网络协议:
   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是用来接收和传送分组的一个端点。

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

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


TCP 通信模型

TCP/IP协议和Socket编程_Socket编程

Socket模型

TCP/IP协议和Socket编程_Android_02


示例代码:

UdpServer.java

package me.bym.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServer {
    public static void main(String[] args) {
        // 声明UPD socket,即DatagramSocket
        DatagramSocket socket = null;
        try {
            // 产生DatagramSocket对象,制定监听端口
            socket = new DatagramSocket(1234);
            // 设置消息读取缓冲区
            byte data[] = new byte[512];
            // 声明和定义UDP数据包,内容是消息缓冲区的内容
            DatagramPacket packet = new DatagramPacket(data, data.length);
            // 调用阻塞方法receiver接受客户端发来的内容存放到消息缓冲区packet中
            socket.receive(packet);
            // 打印消息
            String msg = new String(packet.getData(), packet.getOffset(),
                    packet.getLength());
            System.out.println(msg);
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 关闭socket
            socket.close();
        }
    }
}

UdpClient.java

package me.bym.udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpClient {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        String msg = null;
        try {
            socket = new DatagramSocket();
            // 从标准输入(键盘)读取数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    System.in));
            while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {
                // 产生一个InetAddress,内容是服务器端的IP
                InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
                // 构造要发送消息的数据报, 并制定服务器监听的端口
                DatagramPacket packet = new DatagramPacket(msg.getBytes(),
                        msg.getBytes().length, serverAddress, 1234);
                // 发送数据报
                socket.send(packet);
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            socket.close();
        }
    }
}

TcpServer.java

package me.bym.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
    public static void main(String[] args) {
        // 声明一个服务器端socket
        ServerSocket serverSocket = null;
        // 声明一个socket来接受客户端连接
        Socket socket = null;
        try {
            int temp;
            // 定义服务器端socket并指定监听端口
            serverSocket = new ServerSocket(5937);
            // 调用阻塞式方法来获取客户端连接的socket
            socket = serverSocket.accept();
            // 获取客户端socket的输入流
            InputStream inputStream = socket.getInputStream();
            // 读取客户端socket的输入流的内容并输出
            byte[] buffer = new byte[512];
            while ((temp = inputStream.read(buffer)) != -1) {
                System.out.println(new String(buffer, 0, temp));
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

TcpClient.java

package me.bym.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
    public static void main(String[] args) {
        // 声明一个socket
        Socket socket = null;
        try {
            String msg = null;
            // 产生socket对象,制定服务器地址和服务器监听的端口号
            socket = new Socket("127.0.0.1", 5937);
            // 从标准输入(键盘)读取内容,获取socket的输出流,将读取到的内容放入输出流中
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            OutputStream outputStream = socket.getOutputStream();
            while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {
                outputStream.write(msg.getBytes());
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
            
}



——From: http://blog.csdn.net/baoyiming1991/article/details/6326768