套接字(Socket)
为了方便开发网络应用程序,美国伯克利大学在Unix上实现的一种应用程序访问网络的通信协议Socket,Socket的出现使程序员可以很方便的访问TCP/IP。
TCP与UDP区别
一、TCP面向连接,发送数据前要先建立连接;UDP是无连接的,发送数据前不需要建立连接;
二、TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付;
三、UDP有较好的实时性,效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信;
四、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
下面从代码方面理解一下他们的区别
Tcp客服端
public class Climet {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 8889);
OutputStream outputStream =socket.getOutputStream();
byte [] car = "hello".getBytes();
outputStream.write(car, 0, car.length);
outputStream.flush();
socket.close();
}
}
Tcp服务器端
public class server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8889);
Socket socket = serverSocket.accept();//等待接受客户端请求
InputStream inputStream = socket.getInputStream();
byte [] car = new byte[1024];
int length = inputStream.read(car);
System.out.println(new String(car,0,length));
serverSocket.close();//释放资源
}
}
输出结果
UDP
服务器端步骤:
1. 创建数据Socket,指定一个客户端端口号。
2. 提供一个存储了所发送数据的byte数组,提供服务端的IP地址和端口号。
3. 调用DatagramPacket的send()方法进行数据的发送;
4. 释放资源。
public class Client {
public static void main(String args[]) throws Exception{
DatagramSocket datagramSocket = new DatagramSocket();
// 创建数据包套接字,端口号9999
byte [] car = "你好服务器端".getBytes();
// 根据主机名和端口号创建套接字地址
InetSocketAddress Address = new InetSocketAddress("127.0.0.1", 8889);
// 创建发送的数据包
DatagramPacket datagramPacket = new DatagramPacket(car, car.length, Address);
datagramSocket.send(datagramPacket);// 向服务器端发送数据
}
}
服务器端步骤:
- 创建数据Socket,指定一个服务端端口号。
- 提供一个byte数组用于数据存储。
- 调用DatagramPacket的receive() 方法进行数据的接收;
- 调用DatagramPacket的getData()方法得到byte数组的数据;
- 释放资源。
public class Server { public static void main(String args[]) throws Exception{ DatagramSocket datagramSocket = new DatagramSocket(8889); // 创建数据报包的套接字,端口号8888 byte[] bufferArray = new byte[1024]; // 创建接收的数据报包 DatagramPacket datagramPacket = new DatagramPacket(bufferArray, bufferArray.length); datagramSocket.receive(datagramPacket);// 接受客户端的数据 byte [] car = datagramPacket.getData(); int length = datagramPacket.getLength(); String car = new String(car, 0, length);// 得到数据 System.out.println(car); } }