- 浏览: 25257 次
- 性别:
- 来自: 长春
最新评论
----------------- android培训,java培训、期待与您交流! --------------------
网络编程 1.网络编程概述 网络的模型OSI模型,TCP/IP参考模型。网络通讯要素:ip地址,端口号,传输协议。也就是说,我想和某台机器进行网络的通讯,第一,必须知道你要通讯的机器在哪(IP);第二,计算机上有多个应用程序。你想要和计算机上的哪个应用程序进行通讯,需要明确指定应用程序。(端口);第三,通过一二两个步骤,把基本的通讯通道搭建完成了。在通讯过程中,可以有多种通用通讯规则。你需要明确指定一种通讯的规则完成通讯,如果两者的协议不同不能进行通讯。(传输协议,国际通用TCP/IP)。 端口号的范围:0—65535,0-1024一般被系统的应用程序占用了。 2.网络模型 OSI参考模型:应用层,表示层,会话层,传输层,网络层,链路层,物理层。数据传递过程中经过的那么多层,相当于给数据一层一层地套上外衣(数据封包)。传到另外一台机器上的时候,从底层往上层对应地一层一层脱衣服(数据拆包),最后会到应用层。当应用层拆完数据包后,就会收到传递来的数据。 TCP/IP参考模型(对OSI参考模型进行了简化):应用层(应用层,表示层,会话层),传输层,网际层(网络层),主机至网络层(数据链路层,物理层)。 现在学的是传输层(因为做软件,通过软件来发送数据,协议是tcp/udp)。而web应用程序,属于应用层(协议是http,ftp等)。网络层的协议是:ip。 3.网络通讯要素 IP地址:网络中的设备标示。不易记忆,可用主机名。本地回还地址:127.0.0.1 主机名:localhost。在java语言中提供了方便操作的IP对象InetAddress。关于网络编程的对象java.net包中。代码示例: //获取本地的的InetAddress包含了主机名字,和ip地址。(重点掌握) InetAddress ia1 = InetAddress.getLocalHost(); System.out.println(ia1); // 通过主机名字来获取InetAddress,(重点掌握) InetAddress ia2 = InetAddress.getByName("www.baidu.com"); System.out.println(ia2.toString()); // 通过主机名字来获取所有的InetAddress InetAddress[] ia3 = InetAddress.getAllByName("www.baidu.com"); System.out.println(ia3.length); for(InetAddress ip :ia3){ System.out.println(ip.getHostAddress()); System.out.println(ip.getHostName()); } // toString() = getHostAddress()(重点掌握)+getHostName() 端口号:用于标识进程的逻辑地址,不同进程的标识。有效端口号是:0~65535,其中0~1024系统使用或保留端口。端口没有提供对象,因为它就是一个整数。 传输协议:通讯的规则,常见的有TCP/UDP。提供了相对应的对象。 (重点)TCP和UDP的区别: UDP: A,将数据以及源和目的封装在数据包中,不需要建立连接。B,每个数据报的大小限制在64k内。C,因为无连接,是不可靠的协议。D,不需要建立连接,速度快。(生活中相当于到邮局寄东西,地址(IP),具体人(端口))。聊天udp,视频直播软件,qq,求速度的软件一般都是udp。 TCP: A,建立连接,形成传输数据的通道。B,在连接中进行大数据量的传输。C,通过三次握手完成连接,是可靠的协议。D,必须建立连接,效率速度会稍低。 例:下载。 4,Socket Socket就是为网络服务提供的一种机制。通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。 5,UDP的发送端 1. 建立udpsocket服务。(邮局) 2. 提供数据,并将数据封装到数据包中。(寄的东西,数据,地址,端口) 3. 通过socket服务的发送功能,将数据包发出去。(将已有的数据包发送出) 4. 关闭资源。 5.代码示例: package net; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UdpSend { public static void main(String[] args) { // 1.创建udpsocket服务。不指定发送端的具体端口号,让系统默认产生,也可以自定义。 DatagramSocket sendSocket = null; try { sendSocket = new DatagramSocket(); // 2.创建数据包,将要发送的数据和发送的地址以及端口号,写入包中。 byte[] buf = "itheima".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress .getByName("localhost"), 12345); // 3.将数据包通过socket发送出去。 sendSocket.send(dp); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 4.关闭资源 finally { if (sendSocket != null) { sendSocket.close(); } } } } 6.UDP的发送端 1. 定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标示。方便于明确哪些数据过来该应用程序可以处理。 2. 定义一个数据包,因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。 3. 通过socket服务的receive方法将要收到的数据存入已经定义好的数据包中。 4. 通过数据包对象的特有功能。将这些不同的数据取出。 5. 关闭资源。 6. 代码示例: package net; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpReceive { public static void main(String[] args) { // 1.创建接收端的udpsocket,并监听一个端口用来匹配发送端指定的端口 DatagramSocket ds = null; try { ds = new DatagramSocket(12345); // 2.创建一个数据包用来存储发送端发来的数据包。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); // 3.调用DatagramSocket的recieve方法,来接收发送端发来的数据。 ds.receive(dp); // 4.dp已经接收到发来的额数据包,通过dp获取数据包中的数据。 String hostName = dp.getAddress().getHostName(); String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(hostName+"...."+ip+"...."+data+"...."+port); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 关闭资源 finally{ if(ds!=null){ ds.close(); } } } } 7.UDP的键盘录入方式 用键盘录入的方式实现对讲机功能,代码如下: 发送端:package net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UdpSend2 { public static void main(String[] args) { DatagramSocket ds = null; try { // 创建udpsend的socket服务 ds = new DatagramSocket(); // 键盘输入,并读取键盘数据 BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); String line = null; while ((line = br.readLine()) != null) { // 键盘录入"886“时候,跳出循环,程序停止。并将socket关闭 if(line.equals("886")) break; // 将键盘录入的数据封装到了一个数据包里 byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 12345); // 发送数据包 ds.send(dp); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(ds!=null) ds.close(); } } } 发送端:package net; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.DatagramSocketImpl; import java.net.SocketException; public class UdpReceive2 { public static void main(String[] args) { // 建立udpreceive的socket接收端,并监听端口。不能关闭,因为关闭之后就无法再接收到发来的内容。 DatagramSocket ds=null; try { ds = new DatagramSocket(12345); } catch (SocketException e) { e.printStackTrace(); } while (true) { // 定义数据包接收数据。 byte[] buf = new byte[1024*64]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //接收数据,将接受的数据存储在dp中。 try { ds.receive(dp); // 从dp中获得数据,並打印。 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+data); } catch (IOException e) { e.printStackTrace(); } } } } 8.UDP聊天 package net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UdpQQ { public static void main(String[] args) throws Exception { DatagramSocket sendds = new DatagramSocket(); DatagramSocket recds = new DatagramSocket(10002); new Thread(new Send(sendds)).start(); new Thread(new Rec(recds)).start(); // new Thread(new Send(new DatagramSocket())).start(); // new Thread(new Rec(new DatagramSocket(10002))).start(); } } // 想要在一个进程里面既可以发数据也可以接收数据,那么就用到多线程技术。 class Send implements Runnable { private DatagramSocket sendDs; public Send(DatagramSocket ds) { this.sendDs = ds; } @Override public void run() { try { // 建立socket服务。 // 从键盘读取数据,并把数据封装到数据包中,发送给接收端。 BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); String line = null; while ((line = br.readLine()) != null) { if (line.equals("886")) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 10002); sendDs.send(dp); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (sendDs != null) sendDs.close(); } } } class Rec implements Runnable { private DatagramSocket recDs; public Rec(DatagramSocket ds) { this.recDs = ds; } @Override public void run() { try { // 创建一个接收端的socket服务。 while (true) { // 定义一个数据包用来接收发来的数据。 byte[] buf = new byte[1024 * 64]; DatagramPacket dp = new DatagramPacket(buf, buf.length); // 接收数据。 recDs.receive(dp); // 获得数据包中的数据。 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + "::" + data); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 总结: 如果想要把发送端和接收端不在同一个窗口中输入和输出。其实,平时的(我和你)qq聊天的原理是:1,我上面有一个DatagramSocket发送端,发送数据的时候发送了两次。一个往你上面发(数据包指向本地地址和端口号),一个往自己本地上发(数据包指向你地址和端口号)。2,我上面有一个DatagramSocket接收端,接收数据既有你的信息,又有我的信息。3,你上面和我上面得同理。4,不管你还是我,涉及到的所有端口号必须是一样的。
发表评论
-
黑马程序员——内省
2012-11-23 15:39 551-------------- ... -
黑马程序员——泛型
2012-11-23 09:06 715----------------- android培训、ja ... -
黑马程序员——反射
2012-11-22 16:13 704----------------- android培训、jav ... -
黑马程序员——枚举
2012-11-22 09:54 619----------------- android培训、jav ... -
黑马程序员——银行业务调度系统
2012-11-21 21:31 552----------------- an ... -
黑马程序员——交通灯管理系统
2012-11-20 10:28 758----------------- android培训、ja ... -
黑马程序员——TCP协议
2012-11-17 09:19 807----------------------------an ... -
黑马程序员——File和特殊流对象
2012-11-03 14:38 811-------------------------- an ... -
黑马程序员——Java_IO操作
2012-10-31 20:48 992--------------------------- ...
相关推荐
Socket通信是网络编程中不可或缺的技术,Qt支持基于TCP/IP协议的客户端和服务器端编程,以及UDP通信和组播技术。 多线程是现代应用程序中用来提高性能的重要技术。Qt提供了多线程编程的支持,包括线程的基本概念...
2、Linux网络编程02——无连接和面向连接的区别 3、Linux网络编程03——字节序和地址转换 4、Linux网络编程04——套接字 5、Linux网络编程05——C/S与B/S架构的区别 6、Linux网络编程06——UDP协议编程 7、Linux网络...
4、 什么情况下适合用UDP协议,什么情况下适合用TCP协议? 5、 throw和throws有什么区别? try、catch、finally分别在什么情况下使用? 6、 声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用...
在IT领域,网络编程是构建分布式系统和网络应用程序的基础,其中TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的网络传输层协议。本资源包含"NetWork网络编程TCP和UDP源代码",是学习和实践这两种协议的...
"socket网络(UDP协议编程)"这个标题明确指出了我们要讨论的核心内容——使用套接字(socket)进行网络编程,并且聚焦在用户数据报协议(UDP)上。UDP是一种无连接的、不可靠的传输层协议,与TCP(传输控制协议)...
此外,对于UDP通信,我们还需要了解网络编程的一些基础知识,如IP地址和端口的概念,以及端口的复用和多播等高级特性。在QT中,QUdpSocket还支持多播功能,通过加入多播组可以实现一对多的数据广播。 总的来说,QT...
总之,socket网络编程结合TCP和UDP协议,为开发者提供了强大的工具来构建各种网络应用。理解并熟练掌握这些概念和技巧,是成为合格的IT专业人员的必要步骤。在实践中不断探索和学习,将有助于你更好地应对各种网络...
通信协议——HTTP、TCP、UDP TCP、HTTP、UDP 是三种不同的通信协议,它们之间存在着紧密的关系。TCP/IP 是一个协议组,可以分为四个层次:网络接口层、网络层、传输层和应用层。在传输层中有 TCP 协议与 UDP 协议。...
本压缩包文件聚焦于Linux环境下的网络编程,主要涉及TCP(传输控制协议)和UDP(用户数据报协议)这两种常见的网络通信协议。以下是基于提供的信息,对Linux网络编程中的TCP和UDP知识点的详细阐述: 1. **Linux ...
6. **错误处理**:由于UDP不提供内置的错误检测和重传机制,程序员需要自己实现这些功能。例如,你可以设定超时重发机制或者实现简单的校验和来检测数据完整性。 7. **性能优化**:虽然UDP速度快,但也要注意避免...
基于UDP的Socket编程 ...基于 UDP 的 Socket 编程是一种高效、灵活的网络编程方式,适用于对时间要求较高的网络数据传输应用场景。但是,需要注意 UDP 协议的不可靠连接通信特性,及时处理数据的丢失或者破坏。
本资源包提供的是基于TCP/IP和UDP的socket网络编程源码及文档,适用于实验平台mini2440开发板和Ubuntu操作系统。 TCP/IP协议栈是一个分层的通信模型,包含四层:链路层、网络层、传输层和应用层。TCP(Transmission...
### 通信协议——Http、TCP、UDP #### 一、通信协议概述 通信协议是指在计算机网络中,为实现不同设备间的有效数据交换而制定的一系列规则和标准。这些规则规定了数据传输的方式、格式以及如何处理数据。常见的...
在"网络编程——UDP"这个标签中,可能包含的是如何使用socket编程实现UDP通信,比如发送和接收数据报的过程。 在压缩包内的"nails6uv"文件,可能是本次练习的一个代码示例或者相关的项目名称。它可能包含了使用...
本篇文章旨在深入解读“黑马_Linux网络编程-网络基础-socket编程-高并发服务器”相关的核心概念和技术要点,包括网络基础知识、常用网络协议、网络应用程序设计模式以及分层模型等内容。 #### 网络基础 网络基础...
9. **缓冲区管理**:由于UDP没有内置的数据流控制,需要程序员自己管理发送和接收缓冲区的大小,防止数据溢出或丢失。 10. **性能考虑**:UDP比TCP更快,因为它没有握手和确认过程,但这也意味着没有流量控制和拥塞...
本教程将聚焦于Qt网络编程中的UDP(User Datagram Protocol)通信,涵盖单播、组播和广播三种模式。通过提供的压缩包文件“组播.rar”、“广播.rar”和“单播.rar”,你可以找到对应模式的详细代码实例,并伴有丰富...
在计算机网络中,PING是一种广泛...通过这个课程设计,你将深入理解UDP的工作原理,掌握Java中的网络编程技术,并能应用到实际的网络诊断和测试中。这个项目不仅锻炼了编程能力,还加深了对计算机网络基础知识的理解。
总的来说,TCP和UDP网络编程是构建网络应用的基础,理解其工作原理和编程接口对于开发高效、可靠的网络服务至关重要。无论是TCP的可靠性还是UDP的效率,都需要根据具体应用场景来选择合适的协议。通过实践案例,我们...