网络编程:TCP编程,UDP编程

TCP与UDP区别:

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

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

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

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

TCP编程:

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

2.客户端程序根据服务器程序所在的主机名和端口发出连接请求。

client发送端:

package client;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

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:\\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 (Exception e) {
			e.printStackTrace();
		} 
		/*try {
			DatagramSocket socket = new DatagramSocket(9999);
			byte[] data ="来自客户端的问候".getBytes();
			SocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
			DatagramPacket packet = new DatagramPacket(data, data.length,address);
			socket.send(packet);
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		*/
}
}

连接到服务器端:

Socket socket = new Socket("127.0.0.1",9999);

获取socket连接的输出对象:
 

OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = new FileInputStream("D:\\timg.jpg");

客户端向服务端发送内容:

while ((length = inputStream.read(car))!=-1) {
					outputStream.write(car,0,length);
				}

关闭资源:

outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();

server接收端:

package server;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

public class server {

	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(9999);
			Socket socket =  serverSocket.accept();
			InputStream inputStream = socket.getInputStream();
			byte[] car = new byte[1024];
			int length = 0;
			OutputStream outputStream = new FileOutputStream("F:\\1111.jpg");
			while ((length = inputStream.read())!=-1) {
				outputStream.write(car,0,length);
			}
			outputStream.flush();
			outputStream.close();
			inputStream.close();
			socket.close();
			} catch (IOException e) {
			e.printStackTrace();
		}
		/*try {
			DatagramSocket socket = new DatagramSocket(8888);
			byte[]car =new byte[1024];
			DatagramPacket packet = new DatagramPacket(car, car.length);
			socket.receive(packet);
			packet.getLength();
			int length = packet.getLength();
			System.out.println(new String(car,0,length));
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}*/
	}
}

创建服务端套接字:(端口号与客户端保持一致)

ServerSocket serverSocket = new ServerSocket(9999);

监听客户端请求:

Socket socket =  serverSocket.accept();

获取socket连接输入对象:

InputStream inputStream = socket.getInputStream();

获取来自客户端的数据:

OutputStream outputStream = new FileOutputStream("F:\\1111.jpg");
			while ((length = inputStream.read())!=-1) {
				outputStream.write(car,0,length);
			}

UDP编程:

UDP是用户数据报协议,基于UDP的Socket编程是一种非连接的Socket通信,它提供的是无连接、不可靠信息传送服务。 DatagramSocket:用来发送和接收数据包的套接字

DatagramPacket :表示数据包

client客户端:

步骤:

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

2.提供一个存储了所发送数据的byte数组,提供服务端的IP地址和端口号。

3.调用DatagramPacket的send()方法进行数据的发送;

4.释放资源。

try {
			DatagramSocket socket = new DatagramSocket(9999);
			byte[] data ="来自客户端的问候".getBytes();
			SocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
			DatagramPacket packet = new DatagramPacket(data, data.length,address);
			socket.send(packet);
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

创建数据包套接字:

DatagramSocket socket = new DatagramSocket(9999);

根据主机名和端口号创建套接字地址:(这里可以创建多个IP,发送到多个服务端)

SocketAddress address = new InetSocketAddress("127.0.0.1", 8888);

创建发送的数据包:

DatagramPacket packet = new DatagramPacket(data, data.length,address);

发送数据:

socket.send(packet);

关闭连接:

socket.close();

server服务端:

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

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

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

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

5.释放资源。

try {
			DatagramSocket socket = new DatagramSocket(8888);
			byte[]car =new byte[1024];
			DatagramPacket packet = new DatagramPacket(car, car.length);
			socket.receive(packet);
			packet.getLength();
			int length = packet.getLength();
			System.out.println(new String(car,0,length));
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

创建数据包套接字:

DatagramSocket socket = new DatagramSocket(8888);

创建接收的数据包:

DatagramPacket packet = new DatagramPacket(car, car.length);

接收数据:

socket.receive(packet);

得到并输出数据:

System.out.println(new String(car,0,length));
发布了91 篇原创文章 · 获赞 8 · 访问量 4723

猜你喜欢

转载自blog.csdn.net/niuxikun/article/details/104690426