黑马程序员技术交流社区
标题:
java Socket和DatagramSocket的区别
[打印本页]
作者:
罗忠文
时间:
2012-11-25 14:10
标题:
java Socket和DatagramSocket的区别
java Socket和DatagramSocket的区别,并且写出通信代码
作者:
赵红萍
时间:
2012-11-25 14:46
socket是为网络服务的提供的一种机制,网络通信就是指的socket间的通信,因为通信的两端都有socket,数据在两个socket之间通过IO通信,简单的说就是socket相当于计算机上的一个网络应用程序,这个应用程序最终通过网口传出去.
网络传输的三要素:IP,端口,协议,协议中最长用的是TCP协议和UDP协议.
你上面问的DatagramSocket就是使用UDP协议的socket传输.
UDP协议:将数据及源和目的封装成数据包,不需要建立连接,每个数据包的大小限制在64K内,因为是无连接的,所以是不可靠协议,但是速度快,聊天工具就是使用的是UDP协议.
TCP协议:建立连接形成数据的传输通道,在连接中进行大量的数据传输,通过三次握手完成连接是可靠协议,但效率会低一些,下载用的是TCP协议.
对于UDP的socket传输要有发送端和接受端
UDP的发送端:
DatagramSocket ds = new DatagramSocket();
byte[] buf = "udp".getBytes();
DatagramPacket dp = new DatagramPacket(
buf,
buf.length,
InetAddress.getByName("127.0.0.1"),
10000);
ds.send(dp);
ds.close();
UDP接受端:
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String IP = dp.getAddress().getHostAddress();//获取IP地址
String data = new String(dp.getData(),0,dp.getLength());//获取数据
int port = dp.getPort();//获取端口
System.out.println("IP:"+IP+",data:"+data+",port:"+port);
ds.close();
我这个代码是看不到效果的,因为UDP是无连接传输,如果接受端当时是开着的,就可以接收到,如果没有接受端,那传输的那些数据就丢失了,TCP的传输,你可以看毕老师的java基础视频,老师说的很详细而且有效果,在这里打字敲太费劲而且不一定能说清楚
作者:
罗忠文
时间:
2012-11-25 15:02
能不能给个TCP的
作者:
白磊
时间:
2013-5-9 22:47
TCP用的是Socket和ServerSocket
UDP用的是DatagramSocket
接收端代码
import java.io.IOException;
import java.net.*;
public class Server {
public static void main(String[] args) throws SocketException {
DatagramSocket ds=new DatagramSocket(8888);
byte[]buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength());
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println(str+"::"+ip+"::"+port);
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}finally{
ds.close();
}
}
发送端代码
import java.io.IOException;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket ds=new DatagramSocket();
String str="abc";
DatagramPacket dp=
new DatagramPacket(str.getBytes(),0,str.length(),InetAddress.getByName("localhost"),8888);
try {
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
finally{
ds.close();
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2