- 网络模型:
- OSI模型
- TCP/IP模型
- 网络通信要素
ip地址
端口
通信协议
- 通信过程
1.找到对方IP地址
2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,用唯一的数字进行标识,这些数字符号就是端口
3.定义通信规则,tcp还是udp还是其他
- 应用层协议
http,ftp,smtp
- 解析主机地址:
InetAddress ia = InetAddress.getByName("www.baidu.com");
String ip = ia.getHostName();
- TCP和UDP
1.UDP的特点:
将数据和源地址和目的地址封装成包,不需要建立连接,
每个数据包的大小限制在64k
因为是面向的无连接的形式,所以是一个不可靠的协议(地址不一定就存在,端口不一定打开,若目的不可达,则该包会被丢弃)
不需要建立连接,速度快(常用作:QQ聊天,凌波,网络视频)
2.TCP的特点:
必须要建立连接,形成传输的数据通道
连接在建立后适合在连接中进行大数据的传输
连接的建立需要三次握手,是一种可靠的协议(在断开连接后能立即检测出)
必须要先建立连接,效率会比较低下
- Socket
Socket就是为了网络服务提供的一种机制
通信的两端都是Scoket
网络通信其实就是Socket之间的通信
数据在Socket之间的通信
数据在Scoket间通过IO传输
- 网络地址:192.168.1.0
- 广播地址:192.168.1.255
- TCP传输:
有服务端:ServerSocket
有客户端:Socket
一个服务端可以有多个客户端
通过Scoket对象的getInputStream和getOutputStream方法可以得到Scoket之间的通信IO流
package 网络编程.UDP网络编程; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPRTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //创建UDP服务 DatagramSocket ds = new DatagramSocket(10005);//接收方监听的端口号 //定义数据格式 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf , buf.length); //接收数据 while(true){ ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip+":"+port+":"+data); } } }
package 网络编程.UDP网络编程; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPNetTest { public static void main(String[] args) throws Exception{ //创建UDP服务 DatagramSocket ds = new DatagramSocket(8889);//UDP发送方的端口号 //创建要发送的数据 byte[] buf = "hello world!".getBytes(); DatagramPacket dp = new DatagramPacket(buf , buf.length, InetAddress.getByName("localhost"),10005);//发往对方的地址和对方接收的端口号 //发送 while(true ){ Thread.sleep(1000); ds.send(dp); } } }
package 网络编程.多线程和UDP实现聊天功能; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 聊天室:一个线程控制收数据,一个线程控制发数据 * 因为收和发数据时不一致的,所有要定义两个run方法,所以要定义两个 * @author Administrator * */ public class ChatRoom { public static void main(String[] args) throws Exception{ DatagramSocket sendDs = new DatagramSocket(); DatagramSocket recds = new DatagramSocket(9990); Send send = new Send(sendDs); Receiver re = new Receiver(recds); new Thread(send).start(); new Thread(re).start(); } } class Send implements Runnable{ private DatagramSocket ds; 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){//while循环,保证此线程在特定情况下不死 if("886".equals(line)) break; byte[] buff = line.getBytes(); DatagramPacket dp = new DatagramPacket(buff, buff.length, InetAddress.getByName("192.168.0.255"), 9990); ds.send(dp); } } catch (Exception e) { throw new RuntimeException("发送端异常"); } } } class Receiver implements Runnable{ private DatagramSocket ds; Receiver(DatagramSocket ds){ this.ds = ds; } public void run() { try { while(true){//while循环,保证此线程不死 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String data = new String(dp.getData() , 0 , dp.getData().length); System.out.println(ip+":"+port+"说:"+data); } } catch (Exception e) { throw new RuntimeException("接收失败"); } } }
时间: 2024-10-24 00:28:09