JAVASE_网络编程上

  • 网络模型:
  1. OSI模型
  2. 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("接收失败");
    		}
    	}
    	
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值