· IP地址:InetAddress类:
1. 网络中设备的标识
2. 不易记忆,可以用主机名
3. 本地回环地址:127.0.0.1 主机名:localhost
· 端口号:数据要发送到指定的应用程序上,为了标识这些应用程序,所以给这些网络程序都用数字进行标识。为了方便称呼这些数字,称其为端口——逻辑端口。(有效的端口:0-65535,其中0-1024系统使用或者保留端口)
· 传输协议:是通信的规则,这个规则称为协议;国际组织定义了通用协议TCP/IP,常见的有TCP和UDP
· 将数据的源和目的封装成数据包,不需要建立连接
· 每个数据包的大小限制在64kb内
· 因无连接,是不可靠的协议
· 不需要建立连接,速度快
· 建立连接,形成传输数据的通道
· 在连接中进行大数据量传输
· 通过“三次握手”来完成连接,是可靠协议
· 必须建立连接,效率会稍低
· Socket就是为网络服务提供的一种机制
· 通信的两端都有Socket
· 网络通信其实就是Socket通信
· 数据在两个Socket间通过IO传输
· DatagramSocket和DatagramPakcet类
1. 使用DatagramSocket建立发送端和接收端
2. 用DatagramPacket建立数据包
3. 调用Socket的发送和接收的方法
4. 关闭Socket
注意:发送端和接收端是2个独立运行的程序
· 发送端:在发送端,要在数据包对象中明确目的地IP以及端口,代码示例:
//创建upd服务,通过DatagramSocket对象 DatagramSocket ds = new DatagramSocket(); //确定数据,并封装成数据包 byte[] bs = "hello,udp".getBytes(); DatagramPacket dp = new DatagramPacket(bs, 0, bs.length, InetAddress.getByName("localhost"), 10000); //通过socket服务,将已有的数据包发送出去 ds.send(dp); //关闭资源 ds.close();
· 接收端:在接收端要指定监听的端口
//创建udp socket,建立端点 DatagramSocket ds = new DatagramSocket(10000); //定义数据包,用于存储数据 byte[] bs = new byte[1024]; DatagramPacket dp = new DatagramPacket(bs, bs.length); //通过服务的receive方法将收到的数据存入数据包中 ds.receive(dp); //通过数据包的方法获取其中的数据 String str = new String(dp.getData(),0,dp.getLength()); System.out.println(str+"--"+dp.getAddress()); //关闭资源 ds.close();
· Socket和ServerSocket
1. 建立客户端和服务端
2. 建立连接后,通过Socket中的IO流进行数据的传输
3. 关闭Sokcet
注:客户端和服务端一样是2个独立的程序
· 客户端基本思路
1. 客户端需要明确服务器的IP地址以及端口,这样才可以试着建立连接,如果连接失败,会出现异常
2. 连接成功,说明客户端与服务端建立了通道,那么通过IO流可以进行数据的传输,而Sokcet对象已经提供了输入流和输出流对象,通过getInputStream()和getOutputStream()获取即可
3. 与服务端通讯结束后,关闭Socket。
代码示例:
//建立Socket连接,指定IP地址和端口 Socket s = new Socket("127.0.0.1",10009); //通过Socket对象获取输出流,通过输出流输出 OutputStream out = s.getOutputStream(); out.write("hello".getBytes()); //结束标记,告诉服务端,已经输出完毕 s.shutdownOutput(); //通过Socket对象获取输入流,读取客户端发来的信息 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = 0; //假设服务器只回复一句话,所以不使用while循环了 len = in.read(buf); System.out.println(new String(buf,0,len)); //关闭客户端 s.close();· 服务端基本思路
1. 服务端需要明确它要处理的数据是从哪个端口进入的
2. 当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据的传输
3. 当客户端访问结束,关闭该客户端。也可以选择关闭服务端
代码示例:
//建立ServerSocket并监听端口 ServerSocket ss = new ServerSocket(10009); //通过ServerSocket获取Socket Socket s = ss.accept(); //通过Socket获取输入流,并从客户端读取数据打印 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while((len=in.read(buf))!=-1) { System.out.println(new String(buf,0,len)); } //服务端获取输出流,给客户端返回一句话 OutputStream out = s.getOutputStream(); out.write("ok".getBytes()); //关闭客户端 s.close(); ss.close();//关闭服务端· 在客户端和服务端的通信中。如果使用到了阻塞式的方法,需要定义一个结束标记。虽然我们可以自定义结束标记,但是这种方法十分的麻烦。在Socket类中,有shutdownInputStream()和shutdownOutputStream()的方法
· 在网络中,资源的地址。java提供了URL类,其中提供了大量操作网络协议的方法,例如:
String getFile() :获取URL文件名 String getHost() :获取主机名 String getPath() :获取路径 String getQuery() :获取查询部分 String getPort() :获取端口号· URL的openConnection()方法返回了一个URLConnection对象,通过这个对象可以获取网页的内容。
代码示例:
//将百度的域名传递URL,创建URL对象 URL url = new URL("https://www.baidu.com"); //获取URLConnection对象 URLConnection conn = url.openConnection(); //读取流 BufferedReader bufr = new BufferedReader(new InputStreamReader(conn.getInputStream())); //打印从百度网页读取到的内容 String line = null; while((line=bufr.readLine())!=null) { System.out.println(line); }