您的位置:首页 > 理论基础 > 计算机网络

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

2017-09-19 09:09 267 查看
一、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();
}
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: