黑马程序员--- 学习笔记(第二十三天)

 —————————— ASP.Net+Android+IOS开发.Net培训、期待与您交流!——————————
网络编程
1.找到对方的ip
2.数据要发送到指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序
都用数字标识,为了方便称呼这个标识,叫做端口逻辑端口 0-65535
3.定义通信规则,这个通讯规则称为协议,国际组定义了通用协议TCP/IP(广/局域网)


本机回环IP:127.0.0.1 Localhost


IP分为:IPv4 IPv6 


网络模型:
OSI参考模型       TCP/IP参考模型
1.应用层 1.应用层
2.表示层 2.传输层
3.会话层 3.网际层
4.传输层 4.主机至网络层
5.网络层
6.数据链路层
7.物理层


例如输出过程:qq
数据封包一层层的封,再数据拆包一层层的拆


java.net包中提供了网络编程对象


InetAddress类


getLocalHost();//返回本类对象


有可能发生unknowHostException, 未知主机异常


toString();//返回主机名和主机地址字符串变现形式


getHostAddress();//获取主机地址
getHostName();//获取主机名称


//获取任意一台主机的对象
getByName(); //获取单个
getAllByName();//获取全部 返回数组


/*

InetAddress 

常用方法演示
*/
import java.net.*;
class Demo 
{
	public static void main(String[] args)throws Exception 
	{
		//static InetAddress getLocalHost() 
      //    返回本地主机。 
	  InetAddress id=InetAddress.getLocalHost();
	  
	  sop(id.toString()); 

		sop(id.getHostAddress()); //获取主机地址
		sop(id.getHostName());		   //获取主机名称
		
		//通过指定地址获取主机
		InetAddress local=InetAddress.getByName("192.168.100.3");
		sop(local.getHostName());

	   //指定地址获取多个主机
		InetAddress [] in=InetAddress.getAllByName("www.baidu.com");
		sop(in.length);
	}
	public static void sop(Object o){
		System.out.println(o);
	}
}



UDP传输协议
将数据及源和目的封装到数据包中,不需要建立连接
1.每个数据包的大小限制在64k内
2.因无连接,是不可靠协议
3.不需要建立连接,速度快
4.聊天,视频会议等可以使用UDP协议


TCP传输协议
1.建立连接,形成传输数据的通道
2.在连接中可以进行大数据量传输
3.通过三次握手完成连接,是可靠的协议
4.必须建立连接,效率会稍低
5.下载等可以使用TCP协议


Socket编程(网络编程)
Socket就是为网络服务提供的一种机制,通信两端都有Socket,网络通信其实就是
Socket间的通信,数据在两个Socket间通过IO流传输


UDP传输


DatagramSocket: 发送接收数据
DatagramPacket: 数据包


receive();//接收数据
send();//发送数据


/*
通过UDP传输方式,将一段话发送出去


发送端:


思路:
1.建立UDPSocket服务
2.提供数据并将数据封装到数据包中
3.通过Socket服务发送功能,将数据包发出去
4.关闭资源
*/


/*
通过UDP传输方式,用于接收并处理数据


接收端:


思路:
1.先建立UDPSocket服务,指定接收端口
2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中更多的功能,
可以提取字节数组的不同数据信息
3.通过Socket服务的receive方法将接收到的数据存入到定义好的数据包中
4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5.关闭资源
*/
getPort();     //获取端口
getData();   //获取数据
getAddress(); //获取发送端的IP地址
getLength();//获取数据长度



/*

udp 发送端
*/
import java.net.*;
class UdpSend 
{
	public static void main(String[] args)throws Exception 
	{
		
		DatagramSocket ds=new DatagramSocket(8888);
	//DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
     //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
	   
	   String str="udp测试";
	   byte []buf=str.getBytes();
	   DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.100.3"),1314);

	   ds.send(dp);

	   ds.close();

	}
}

/*
接收端
*/
import java.net.*;
class UdpRece 
{
	public static void main(String[] args)throws Exception 
	{
		//DatagramSocket(int port) 
        //  创建数据报套接字并将其绑定到本地主机上的指定端口。
		DatagramSocket ds=new DatagramSocket(1314);

		//DatagramPacket(byte[] buf, int length) 
        //  构造 DatagramPacket,用来接收长度为 length 的数据包。
		byte buf[]=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf,buf.length);

		ds.receive(dp);

		InetAddress in=dp.getAddress();
		sop(new String(dp.getData(),0,dp.getLength()));
		sop(in.getHostAddress());
		sop(in.getHostName());
		sop(dp.getLength());
		sop(dp.getPort());

		ds.close();
		
	}
	public static void sop(Object o){
		System.out.println(o);
	}
}



/*
键盘录入  发送数据
*/
import java.net.*;
import java.io.*;
class Send 
{
	public static void main(String[] args)throws Exception 
	{
		DatagramSocket ds=new DatagramSocket(8888);

		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		
		String line=null;

		byte []buf=null;
		while((line=br.readLine())!=null){
			 if("over".equals(line))
				 break;
			 buf=line.getBytes("utf-8");
			DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.100.3"),1314);
			ds.send(dp);
		}

		br.close();
		ds.close();
		
	}
}

/*
接收端

不断接收客户的数据
*/
import java.net.*;
class Rece 
{
	public static void main(String[] args)throws Exception 
	{
		DatagramSocket ds=new DatagramSocket(1314);
		
		byte []buf=new byte[1024];

		while(true){
	
			DatagramPacket dp=new DatagramPacket(buf,buf.length);

			ds.receive(dp);

			System.out.println(new String(dp.getData(),0,dp.getLength(),"utf-8"));
		}
	}
}



Tcp传输
Socket 客户端
ServerSocket 服务端


客户端通过查阅Socket对象,发现在该对象建立时,就可以去连接指定主机
,因为tcp是面向连接的,所以在建立Socket服务时,就要有服务端. 连接成功后
形成通路后,在该通道进行数据的传输
步骤
1.创建Socket服务,并指定要连接的主机地址和端口
2.通过io进行数据的读取和输出
3.关闭客户端


服务端:
1.建立服务的Socket服务,ServerSocket,并监听一个端口
2.获取连接过来的Socket客户端对象,通过serverSocket对象的accept方法
3.客户端如果发送来数据,那么服务端使用对应的客户端对象,并获取到该对象
的读取流来获取发过来的数据,并打印在控制台上
4.关闭服务端(可选)




该例子出现的问题:    通过键盘录入出现的 
现象:客户端和服务端两端都在等待,为什么呢?
因为客户端和服务端都有阻塞式方式,这写方法没有读到结束标记
那么就一直在等待,而导致两端都在等待



/*
文件转换器

客户端

 
*/
import java.io.*;
import java.net.*;
class Client 
{
	public static void main(String[] args)throws Exception 
	{
	//	Socket(InetAddress address, int port) 
        //  创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
		Socket s=new Socket("192.168.100.3",1314);
		
	  //  OutputStream getOutputStream() 
      //    返回此套接字的输出流。
			PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
				// InputStream getInputStream() 
		   //   返回此套接字的输入流。 
			BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
			
			String line=null;
			
			while((line=br.readLine())!=null){
				pw.println(line);

				System.out.println(brin.readLine());
			}

		br.close();
		s.close();
	}
}

/*
文字转换器

服务端
*/
import java.io.*;
import java.net.*;
class Server 
{
	public static void main(String[] args)throws Exception 
	{

		ServerSocket ss=new ServerSocket(1314);
	
		while(true){
			Socket s=ss.accept();
			BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
			
			
			PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

			String line=null;
			while((line=br.readLine())!=null){
				  pw.println(line.toUpperCase());
			}
		}
	}
}

/*
TCP复制文本文件 
*/
import java.io.*;
import java.net.*;
class  	PicClient
{
	public static void main(String[] args)throws Exception 
	{
		Socket	 s=new Socket("192.168.100.3",1314);

		 BufferedReader br=new BufferedReader(new FileReader("test.txt"));

		 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		 BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
		 String line=null;
		 while((line=br.readLine())!=null){
		 	 bw.write(line);
			 bw.newLine();
			 bw.flush();
		 }
		 s.shutdownOutput();

		 System.out.println(brin.readLine());

		 br.close();
		 s.close();
	}
}
class PicServer
{
	public static void main(String []args)throws Exception{
			ServerSocket ss=new ServerSocket(1314);
			
			Socket s=ss.accept();

			BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));

			BufferedWriter bw=new BufferedWriter(new FileWriter("server.txt"));

			String line=null;

			while((line=br.readLine())!=null){
				bw.write(line);
				bw.newLine();
				bw.flush();
			}


			bw.close();
			s.close();
			ss.close();
	}
}


 —————————— ASP.Net+Android+IOS开发.Net培训、期待与您交流!——————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值