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

来源:互联网 发布:购买域名后需要备案吗 编辑:程序博客网 时间:2024/05/16 10:40
 —————————— 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培训、期待与您交流!——————————

0 0