黑马程序员:Socket编程之(UDP vs TCP)

---------------------- ASP.Net+Unity开发 .Net培训、期待与您交流! ----------------------

UDP和TCP都是传输协议,设备之间遵循通讯协议完成网络连接,实现数据传输。

TCP是一种基于连接的网络通信协议,TCP连接两端分别为客户端和服务端,对应的类分别为Socket(客户端)和ServerSocket(服务器)。一旦有客户端,就必须有相应的服务器端与之对应,否则,将实现不了网络连接;

而UDP不一样,UDP是基于无连接的,UDP连接两端分别为,发送方和接收方,假设有一个发送端,不管有没有接收端,他都可以发送发送数据。但因为没有接收端接收,会造成数据丢失数据。相比UDP,TCP能确保数据的正确性。UDP连接对应的类是DatagramSocket,使用该类创建一个网络应用程序,并绑定一个端口,可用户自行制定,也可不指定,此时将有系统随机分配。但是在创建接收端应用程序时,最好绑定指定的端口号。否则,发送端将不知道把数据发往哪里。

UDP设备之间数通过数据包(DatagramPacket)进行数据传输。发送端首先将要发送的数据打包,即封装到DatagramPacket对象中,然后使用DatagramSocket对象的send()方法,将数据包发给接收端。接收端使用DatagramSocket的receive方法获取数据包。简单地说,就是一个打包和拆包的过程。

TCP设备间,构造一个通路,使用数据流进行数据传输。客户端和服务器建立连接后,通过客户端对象(Socket)的输入流和输出流进行数据传输。也可以说,服务器端是没有创建流对象。它是通过ServerSocket类提供的accept方法,来获取客户端对象(Socket),然后使用客户端对象再获取流对象。所以说,服务端和客户端都是用客户端的流对象进行数据传输。通过Socket类提供的getInputStream()方法来获取输入流(InputStream),再使用InputStream的read()方法,读取数据。通过Socket类提供的getOutputStream()方法获取输出流(OutputStream),再使用OutputStream的write方法发送数据。

下面是给出了TCP连接的例子:

//客户端
class TcpClient{
public static void main(String[] args)
{
try{
//首先建立客户端服务,并让这个客户端连接到主机“192.168.1.107”,端口号为10004应用程序上。
Socket s = new Socket("192.168.1.107",10004);
//获取客户端的输入流,读取数据。
InputStream in = s.getInputStream();
//获取客户端的输出流,输出数据。
OutputStream out = s.getOutputStream();
//向服务器发送数据
out.write("服务端,我是客户端!!!".getBytes());
//获取服务器的反馈,首先定义一个缓冲区
byte[] buf = new byte[1024];
int len = in.read(buf);//读取数据,并将数据存入缓冲区buf中
//将获取到的数据,转换为字符转打印到控制台
String data = new String(buf,0,len);
System.out.println(data);
//关闭客户端程序
s.close();
}catch(Exception e){
throw new RuntimeException("连接服务器失败");
}
}
}


//服务端(服务端的ip为192.168.1.107)

class TcpServer{
public static void main(String[] args) throws Exception
{
//首先建立服务器,绑定端口。
ServerSocket ss = new ServerSocket(10004);
//获取客户端对象
Socket s = ss.accept();
//获取客户端的输入流,得到客户端发送过来数据
InputStream in = s.getInputStream();
//获取客户端的输出流,用于向客户端发送消息
OutputStream out = s.getOutputStream();
//读取客户端发送过来的数据
byte [] buf = new byte[1024];
int len = in.read(buf);
String ip = s.getInetAddress().getHostAddress();
String data = new String(buf,0,len);
//将客户端发送过来的数据打印到控制台
System.out.println(ip + "...:" + data);
//获取客户端信息后,给客户端反馈
out.write("客户端,你好,你的消息已收到!".getBytes());
}

}


---------------------- ASP.Net+Unity开发 .Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值