TCP与UDP在socket中传输通信的区别

一、TCP

TCP是面向连接的,可靠的传输协议,它具有数据确认和数据重传机制,保证数据一定能传到通信的另一方,它适合的是数据量大、数据完整性要求高的通信场合。

代码如下:


服务端:

 
  
package com.lanqiao.facetest;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基于TCP的通信传输
 * 这是服务端
 * @author Administrator
 *
 */
public class Server {
	public static void main(String[] args) {
		try {
			//创建一个ServerSocket对象,并且设置端口号
			ServerSocket ss = new ServerSocket(10086);
			while(true){
				//侦听并接收此套接字的连接
				Socket s = ss.accept();
				//建立输出流输出数据,客户端的输入流获取相关数据
				OutputStream os = s.getOutputStream();
				DataOutputStream ds = new DataOutputStream(os);
				ds.writeUTF("客户端的ip是:"+s.getInetAddress()+"客户端的端口号是:"+s.getPort());
				s.close();
				os.close();
			}
		} catch (IOException e) {
			System.out.println("创建ServerSocket对象失败");
			e.printStackTrace();
		}
		
	}
}


 
  
 
  

 
  

客户端:

package com.lanqiao.facetest;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	public static void main(String[] args) {
		try {
			//创建一个socket,填上服务器的ip和端口号,访问服务器
			Socket s = new Socket("127.0.0.1",10086);
			//创建一个输入流,读取服务端给客户端的输出的数据
			InputStream is = s.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			System.out.println(dis.readUTF());
		} catch (UnknownHostException e) {
			System.out.println("找不到服务端主机:");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("流异常:");
			e.printStackTrace();
		}
	}
}

 
  

二、UDP

UDP是无连接的,是不可靠的传输协议,不具备数据确认和数据重传机制,对数据的完整性和是否被通信的另一方接收无法保证保证,适合小数据、要求传输速度快的通信场合使用。

代码如下:


接收端:

package com.lanqiao.facetest;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TestUDP {
	public static void main(String[] args) {
		try {
			//创建一个数据报包的套接字(每个数据报都有自己的套接字)
			DatagramSocket ds = new DatagramSocket(8888);
			//创建一个比特数组作为设置接收数据缓冲大小
			byte[] buf = new byte[1024];
			//创建接收的数据报包
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			System.out.println("服务端");
			while(true){
				ds.receive(dp);
				//创建一个ByteArrayInputStream作为缓冲
				ByteArrayInputStream bais = new ByteArrayInputStream(buf);
				//创建DataInputStream将ByteArrayInputStream包装在里面
				DataInputStream dis = new DataInputStream(bais);
				//读取流中的数据
				System.out.println(dis.readLong());
			}
		} catch (SocketException e) {
			System.out.println("套接字异常:");
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 
  
发送端:

package com.lanqiao.facetest;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class TestUDPClient {
	public static void main(String[] args){
		try {
			//这个是要传过去的数
			long lon = 10000L;
			//这是一个将数据转换为byte数组的流
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			//将ByteArrayOutputStream包装在DataOutputStream流中
			DataOutputStream dos = new DataOutputStream(baos);
			dos.writeLong(lon);
			
			byte buf[] = baos.toByteArray(); 
			System.out.println("客户端:");
			
			DatagramSocket ds = new DatagramSocket(9999);
			DatagramPacket dp = new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1", 8888));
			ds.send(dp);
			ds.close();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


 
  



你可能感兴趣的:(java类)