首先看一下经典的ISO/IOS网络模型
其中常用的协议在应用层、传输层、网络层。
应用层:远程登入协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP等。
传输层:传输控制协议TCP、用户数据报协议UDP。
TCP:面向连接的可靠的传输协议。
UDP:是无连接的,不可靠的传输协议。
网络层:网际协议IP。
******************************************************************************************************************************
这里着重介绍下TCP、UDP协议
TCP:(Transfer Control Protocol)是一种面向连接的保证可靠传输的协议。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,
当一个socket(通常是server socket)等待连接时,另一个socket可以要求连接,一旦两个socket建立起来,他们就可以进行双向数据传输。
HTTP、FTP、Telent等应用都需要靠这种可靠的通信通道。
UDP:(User Datagram Protocol)是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址。UDP就像写信一样,填上对方的地址就发送出去
他在网络上以任何可能的路径到达目的地,但能否到达目的地、到达时间及内容的正确性都不能考证。
*******************
作为一个简单比较
——使用UDP,每个数据报中都给出了完整的地址信息、因此无需建立发送方和接收方的连接。
——对于TCP协议,它是一个面向对象的连接,在socket之间进行数据传输之前必然要建立连接,所以TCP中多了一个连接建立的时间。
——UDP传输数据时有大小限制,每个传输的数据必须在64KB之内。
——TCP没有限制,一旦建立连接,双方的socket可以按统一的格式传输数据
**************************************************************************************************
通常TCP协议的实现是由套接字socket来完成。socket是连接运行在网络上的两个程序间的双向通讯的端点。通常一个socket在服务器端;另一个在socket
在客户端。下图使用ServerSocket和Socket实现服务器端和客户端的Socket通信。不管使用什么形式,其基本模型都是下面形式。
服务器端
首先java提供ServerSocket实现服务端的socket,该socket等待服务端的请求到来;
构造对象后调用accept()方法,当没人连接时,该方法会阻塞,直到接受连接,并返回socket对象;
客户端
建立socket对象,标明连接对象,端口号;
一旦双方的连接建立好后,双方是平等的,在流上进行双向的数据传递。通信完成后关闭资源。
服务器代码:
package net;
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) throws IOException
{
//监听5000端口
ServerSocket ss = new ServerSocket(5000);
Socket socket = ss.accept();
//获取客户端的输出流
InputStream is = socket.getInputStream();
byte[] buffer = new byte[200];
int length = 0;
while(-1 != (length = is.read(buffer,0,buffer.length)))
{
String str = new String(buffer,0,length);
System.out.println(str);
}
is.close();
socket.close();
}
}
客户端代码:
package net;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 5000);
//建立客户端的输出流
OutputStream os = socket.getOutputStream();
//往输入流中写内容
os.write("HelloWorld".getBytes());
//没写close()方法会提示出错
socket.close();
}
}
*************************************************************************************************************
基于UDP的通信协议
java中使用DatagramSocket类来利用UDP协议实现客户与服务器的Socket,send()发送数据包,receive()接受数据包。
实现步骤:
1.服务器端构造DaragramSocket对象,然后载构造DatagramPacket对象,数据报包,将发送的数据放在DaragramPacket包中;
2.将数据包通过send()和receive()实现发送或接受,当客户端填好地址及端口将数据包发送给服务端时,packet可以通过getAddress()
与getPort()获得客户端的地址与端口;
3.发送完后再次构造与接受;
服务器端代码:
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpServer
{
public static void main(String[] args) throws Exception
{
//定义socket
DatagramSocket socket = new DatagramSocket();
String string ="hello world";
//定义包,发送给目标机器localhost
DatagramPacket packet = new DatagramPacket(string.getBytes(),
string.length(),InetAddress.getByName("localhost"),7000);
//定义完包后发送
socket.send(packet);
//下面接受对方发过来的welcome
byte[] buffer = new byte[1000];
DatagramPacket packet2 = new DatagramPacket(buffer, 100);
socket.receive(packet2);
System.out.println(new String(buffer,0,packet2.getLength()));
//关闭流
socket.close();
}
}
客户端代码:
package net;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpClient
{
public static void main(String[] args) throws Exception
{
DatagramSocket socket = new DatagramSocket(7000);
byte[] buffer = new byte[1000];
DatagramPacket packet = new DatagramPacket(buffer, 1000);
//接收
socket.receive(packet);
//打印接收的内容
System.out.println(new String(buffer,0,packet.getLength()));
//发送welcome
String string = "welcome";
//通过接受的packet,获取服务器端地址及端口号
DatagramPacket packet2 = new DatagramPacket(string.getBytes(),
string.length(),packet.getAddress(),packet.getPort());
socket.send(packet2);
socket.close();
}
}
这里UDP的代码形式和TCP的可以形成对比,UDP就像写信一样,写好内容,收信人地址、端口就可以发送出去,
待对方收到信要回信时,可以通过信封上的地址回信;而TCP是以流的形式实现数据的传送。