黑马程序员------网络编程(No.1)(网络编程概述、UDP)
来源:互联网 发布:unity3d海底场景demo 编辑:程序博客网 时间:2024/06/06 02:52
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
网络编程
网络模型
网络通信要素
1.ip地址 InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
2.端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024为系统使用或保留端口
3.传输协议
通讯的规则
常用协议:TCP、UDP
TCP、UDP区别
UDP
将数据及源和目的封装成数据包,不需要建立连接。
每个数据大小限制在64k内。
因为无连接,是不可靠协议。
不需要建立连接,速度快。
(聊天、游戏、视频)
TCP
建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低。
基于上述特性,不难得到结论,TCP协议适用于对效率要求相对低,但对准确性要求相对高的场景下,或者是有一种连接概念的场景下。
而UDP协议适用于对效率要求相对高,对准确性要求相对低的场景。
TCP一般用于文件传输(对数据准确性要求高,速度可以相对慢),发送或接收邮件,远程登陆等等;
UDP一般用于即时通信,在线视频,网络电话,游戏等等。
网络通信:
1.找到对方IP
2.数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序
都用数字进行标识。称之为端口。逻辑端口。
3.定义通信规则。这个通信规则称为协议。国际组织定义了通用协议TCP/IP。
import java.net.*;class IpDemo{public static void main(String[] args)throws Exception{InetAddress ia = InetAddress.getLocalHost();//得到InetAddress对象System.out.println(ia.getHostAddress());//得到地址System.out.println(ia.getHostName());//得到主机名InetAddress i = InetAddress.getByName("www.baidu.com");System.out.println(i);}}
UDP
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间是通过IO传输。
通过UDP方式,将一段文字发送出去。
思路:
1.建立UDP Socket服务。
2.提供数据,并将数据封装在数据包中
3.通过Socket服务的发送功能,将数据发送出去
4.关闭资源。
通过UDP方式,接收传输的数据。
思路:
1.建立UDP Socket服务。
2.定义一个数据包,因为要存储接收到的字节数据。因为数据包中有更多功能可以提取字节数据中的不同数据信息。
3.通过Socket的receive方法将收到的数据存入已定义的数据包中。
4.通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
5.关闭资源。
/*需求:通过UDP方式,将一段文字发送出去。思路:1.建立UDP Socket服务。2.提供数据,并将数据封装在数据包中3.通过Socket服务的发送功能,将数据发送出去4.关闭资源。*/import java.net.*;class SendDemo{public static void main(String[] args) throws Exception{//建立UDP Socket服务。DatagramSocket s = new DatagramSocket(9999); //提供数据,并将数据封装在数据包中byte[] buf = "welecome to java".getBytes();int length = buf.length;DatagramPacket p = new DatagramPacket(buf,length,InetAddress.getByName("114.214.106.23"),2222);//通过Socket服务的发送功能,将数据发送出去s.send(p);//关闭资源s.close();}}/*需求:通过UDP方式,接收传输的数据。思路:1.建立UDP Socket服务。2.定义一个数据包,因为要存储接收到的字节数据。因为数据包中有更多功能可以提取字节数据中的不同数据信息。3.通过Socket的receive方法将收到的数据存入已定义的数据包中。4.通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。5.关闭资源。*/class ReceiveDemo{public static void main(String[] args) throws Exception{//建立UDP Socket服务。建立端点DatagramSocket s = new DatagramSocket(2222); //定义数据包,用于存储数据。byte[] buf = new byte[20];int length = 20;DatagramPacket p = new DatagramPacket(buf,length);//通过receive方法将收到的数据存入数据包中。s.receive(p);//通过数据包的方式获取其中数据String ip = p.getAddress().getHostAddress();//发送端ipString name = p.getAddress().getHostName();String data = new String(p.getData());//发送数据int port = p.getPort();//发送端端口System.out.println("ip:"+ip);System.out.println("port:"+port);System.out.println("name:"+name);System.out.println("data:"+data);//关闭资源s.close();}}
根据上面的程序,加以扩展,可以实现键盘输入:
import java.net.*;import java.io.*;class SendDemo{public static void main(String[] args) throws Exception{//建立UDP Socket服务。DatagramSocket s = new DatagramSocket(9999); //提供数据,并将数据封装在数据包中BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line=br.readLine())!=null){if("886".equals(line))break;byte[] buf = line.getBytes();DatagramPacket p = new DatagramPacket(buf,buf.length,InetAddress.getByName("114.214.106.23"),2222);s.send(p);}s.close();}}class ReceiveDemo{public static void main(String[] args) throws Exception{//建立UDP Socket服务。建立端点DatagramSocket s = new DatagramSocket(2222); while(true){//定义数据包,用于存储数据。byte[] buf = new byte[1024];int length = buf.length;DatagramPacket p = new DatagramPacket(buf,buf.length);//通过receive方法将收到的数据存入数据包中。s.receive(p);//通过数据包的方式获取其中数据String ip = p.getAddress().getHostAddress();//发送端ipString name = p.getAddress().getHostName();String data = new String(p.getData(),0,p.getLength());//发送数据int port = p.getPort();//发送端端口System.out.println("ip:"+ip+": "+data);}}}
编写一个聊天程序。
有收数据的部分,和发数据的部分。
这两部分需要同时执行。
那就需要用到多线程技术。一个线程控制收,一个线程控制发。
因为收和发的动作是不一致的,所以定义两个run方法。
而且这两个方法呀封装到不同的类中。
import java.io.*;import java.net.*;//定义发送线程class Send implements Runnable{private DatagramSocket ds;//构造函数public Send(DatagramSocket ds){this.ds = ds;}public void run(){try{//建立键盘输入流BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;//读取写入的数据,并发送到指定地址和端口while((line = br.readLine())!=null){byte[] buf = line.getBytes();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("114.214.106.23"),5555);ds.send(dp);}//br.close();//关闭资源ds.close();}catch (Exception e){throw new RuntimeException("输入操作无法完成");}}}//定义收线程class Rece implements Runnable{private DatagramSocket ds;public Rece(DatagramSocket ds){this.ds = ds;}public void run(){try{//无限循环等待接收数据while(true){byte[] buf = new byte[1024];//定义数据包DatagramPacket dp = new DatagramPacket(buf,buf.length);//将接收的信息写入数据包ds.receive(dp);String ip = dp.getAddress().getHostAddress();String data = new String (dp.getData(),0,dp.getLength());System.out.println(ip+" : "+data);}}catch (Exception e){throw new RuntimeException("读取操作无法完成");}}}class ChatDemo{public static void main(String[] args)throws Exception{//定义UDP的SocketDatagramSocket send = new DatagramSocket();DatagramSocket rece = new DatagramSocket(5555);//定义线程,并且开始线程new Thread(new Send(send)).start();new Thread(new Rece(rece)).start();}}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net
- 黑马程序员------网络编程(No.1)(网络编程概述、UDP)
- 黑马程序员------网络编程(TCP&UDP)
- 黑马程序员---网络编程(UDP、TCP)
- 黑马程序员——网络编程(一)--概述、UDP网络程序
- 黑马程序员-网络编程概述-网络模型-UDP-TCP
- 黑马程序员----------UDP网络编程
- 黑马程序员 ---网络编程 UDP
- 黑马程序员-网络编程UDP
- 黑马程序员_毕向东JAVA基础_网络编程(概述&UDP&TCP)
- 黑马程序员_ 网络编程(1) UDP
- 黑马程序员_网络编程(UDP、TCP特点)
- (黑马程序员)学习笔记,网络编程UDP
- 黑马程序员-----java基础-----------网络编程 (udp-接收端)
- 黑马程序员-java基础网络编程(UDP)
- 黑马程序员---网络编程(简介、UDP传输)
- 黑马程序员——网络编程——网络编程概述,UDP协议,TCP协议
- 黑马程序员——网络编程(一)------概述
- 黑马程序员------网络编程(No.2)(TCP)
- AutoCAD二次开发之视图操作(3)指定视图大小和中心点来设置视图
- foj_1532
- IOS私有API的了解
- delphi从dll中调用图片资源
- NSBundle介绍
- 黑马程序员------网络编程(No.1)(网络编程概述、UDP)
- 常用Android对话框的封装
- trim&option的Click
- 浏览器内核分类
- 黑马程序员java 图片添加水印
- 黑马程序员java 图片添加水印
- 正则表达式总结(一)
- where 1 = 1
- 黑马程序员JAVA 俄罗斯方块