说是原创,其实确实是抬举我了,我是看了张孝祥老师的视频后才会的,但是确实是我独立做出的,盗用别人的代码是可耻,但是能借鉴别人的思想,确实对自己有所帮助,我也因此受益匪浅。好,废话不多说,进入正题。
Socket网络编程有2种,tcp,udp,一般人可能tcp听的比较多,用的也比较多,而对udp确不是很了解,那么我来说下,udp(user datagram protocol)翻译过来就是用户数据报协议。
我想说的是tcp和udp的区别,tcp需要先写一个服务器类,再写一个客户端类,服务器类中new 一个ServerSocket,然后用accept()方法与连接过来的Socket建立连接。但是udp是不建立连接的,udp自己管自己忘目的地发送一个DatagramPacket,他不管你有没接收,他发好他就完成任务了。udp编程你要写个发送的类,写 一个接收的类,并且在运行时,要先运行接收的类,不然发送的类发送完东西就结束了,你还一直在接收,这就没必要了吧。
说了这么多,大家肯定烦了,尼玛代码怎么写啊不知道,讲了一堆废话,好,那么直接说怎么写代码吧(不喜勿喷,不喜勿喷,谢谢各位看官了。)
UdpSend:
public class UdpSend {
public static void main(String[] args) {
try {
DatagramSocket ds=new DatagramSocket();
/*上面一行为什么不加端口号呢呢,这可大有来头
当你new 一个DatagramSocket对象没给参数时,系统会默认给一个没用过的端口号。
这样你就不用担心用到了系统正在用的端口号了,当然你给他 也不算你错啦
来个比较经典的例子:你给别人打电话,你需要知道自己的电话号码嘛?
可能还是有人不是很清楚,没关系,因为我当时一看也没怎么理解,先看下面代码
*/
DatagramPacket dp=new DatagramPacket("ni hao !".getBytes(),"ni hao !".length(),InetAddress.getByName("localhost"),3333);
/*
这里又可以举个例子:你给别人打电话,你是不是要知道别人的电话号码
这里的电话号码在代码里的体现就是IP地址和port端口号
*/
ds.send(dp);
ds.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UdpReceive:
public class UdpReceive {
public static void main(String[] args) {
try {
DatagramSocket ds=new DatagramSocket(3333);
/*
再举例子:你要别人给你打电话,你是不是要告诉别人你的电话号码,不然别人怎么给你打
*/
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
/*
udpSend里面的DatagramPacket带了4个参数呢,这里为什么只有2个参数
举个例子:你接电话的时候你要知道对方的电话号码,你才能接嘛?不是的,你不用知道,你可以接,至于接不接我们姑且先不讨论,现在讨论的是,你能不能接到?能。
在代码里的意思就是说,我不管你是从哪里发过来的消息,我不需要知道你的IP你的端口,我都可以接到,至于程序员用不用这个消息,那就由他了。
*/
ds.receive(dp);
ds.close();
System.out.println(new String(buf,0,dp.getLength()));
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
解释了4行最关键的代码,只要你能理解这四行,那么差不多就能理解udp编程了,当然这只是入门而已,想要精通就上网找更多的例子。
希望对大家有帮助。
哦 对了,再说一点,上面传输的是不是英文的字符串啊,那么如果传输中文的呢?
没错,报错是不会报错,可是不能正确传输,为什么呢 为什么呢??
因为中文是2个字节的嘛,所以你不能用字符串长度代表数组长度了,。。懂了木有?不有的话,可以问我,我非常乐意解答,虽然我是菜鸟,可是大家不要嫌弃我哈。。。