欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java网络编程 TCP/IP与UDP

程序员文章站 2022-06-30 10:26:20
...

套接字(Socket)

Socket最初是加利福尼亚大学Berkeley分校为Unix系统开发的网络通信接口。后来随着TCP/IP网络的发展,Socket成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API。

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

TCP/IP编程

使用TCP/IP的套接字(Socket)进行通信

  1. 服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端到端口的连接请求。

  2. 客户端程序根据服务器程序所在的主机名和端口发出连接请求。
    Java网络编程 TCP/IP与UDP

使用ServerSocket和Socket实现服务器端和客户端的Socket通信
Java网络编程 TCP/IP与UDP
代码实现举例

//服务器端程序
public class Server {

	public static void main(String[] args) {
		try {
			//设置服务器端口号
			ServerSocket serverSocket = new ServerSocket(9999);
			//接受连接
			Socket socket =serverSocket.accept();

			//接收传输过来的数据
			InputStream inputStream =socket.getInputStream();
			//将文件输出到指定目录并命名
			OutputStream outputStream =new FileOutputStream("D:\\images\\Server.jpg");
			byte car[] =new byte[1024];
			int length=0;
			while ((length=inputStream.read(car))!=-1) {
				outputStream.write(car,0,length);
			}
			
			//最后关闭资源
			outputStream.flush();
			outputStream.close();
			inputStream.close();
			socket.close();
			serverSocket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

//客户端程序
public class Client {

	public static void main(String[] args) {
		try {
			//创建与服务器端连接
			Socket socket = new Socket("127.0.0.1", 9999);
			//创建向服务器输出数据对象
			OutputStream outputStream =socket.getOutputStream();
			//读取指定文件
			InputStream inputStream =new FileInputStream("D:\\images\\timg.jpg");
			//向服务器输出数据对象
			byte car[] =new byte[1024];
			int length=0;
			while ((length=inputStream.read(car))!=-1) {
				outputStream.write(car,0,length);
			}
			//关闭资源
			outputStream.flush();
			outputStream.close();
			inputStream.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

结果:
Java网络编程 TCP/IP与UDP

UDP编程

  • UDP是用户数据报协议,基于UDP的Socket编程是一种非连接的Socket通信,它提供的是无连接、不可靠信息传送服务。

  • DatagramSocket:用来发送和接收数据包的套接字

  • DatagramPacket :表示数据包

Java网络编程 TCP/IP与UDP

步骤:

  1. 创建数据Socket,指定一个服务端端口号。

  2. 提供一个byte数组用于数据存储。

  3. 调用DatagramPacket的receive() 方法进行数据的接收。

  4. 调用DatagramPacket的getData()方法得到byte数组的数据。

  5. 释放资源。

代码实现举例

//服务器端程序
public class Server {

	public static void main(String[] args) {
		try {
			//设置端口号
			DatagramSocket socket =new DatagramSocket(8888);
			//创建数据包并接收数据
			byte [] car = new byte[1024];
			DatagramPacket packet = new DatagramPacket(car,car.length);
			socket.receive(packet);
			int length =packet.getLength();
			System.out.println(new String(car,0,length));
			//关闭资源
			socket.close();
		} catch (SocketException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}

//客户端程序
public class Client {

	public static void main(String[] args) {
		try {
			//设置端口号
			DatagramSocket socket =new DatagramSocket(9999);
			//创建连接地址并发送数据
			byte [] data = "from client".getBytes();
			SocketAddress address =new InetSocketAddress("127.0.0.1", 8888);
			DatagramPacket packet= new DatagramPacket(data,data.length,address);
			socket.send(packet);
			//关闭资源
			socket.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

服务器都端控制台:
Java网络编程 TCP/IP与UDP

TCP/IP与UDP区别

1、TCP面向连接,发送数据前要先建立连接;UDP是无连接的,发送数据前不需要建立连接。

  • 从我们的举例可以看到TCP/IP编程方式需要先进行连接才能发送数据。UDP编程方式需要设置端口号,然后创建SocketAddress,在发送数据时,才根据地址端口号进行连接。

2、TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付。

3、UDP有较好的实时性,效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信。

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

  • 从我们的举例可以看到TCP/IP编程方式的数据发送是建立在连接的基础上的。而UDP编程方式则可以根据不同的SocketAddress对象,进行不同端口的连接并完成数据传输。