------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
< 今日心情 >放掉懒惰,再加上一份坚持
一、网络通讯三要素
1.IP地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
2.端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口号:0~65535,其中0—1024系统使用或保留端口
3.传输协议
通信的规则
常见协议:TCP、UDP
TCP:面向连接,数据传输安全,效率相对较低
UDP:面向无连接,数据传输不安全,速度快
二、数据传输
1.Socket
Socket是为网络服务提供的一种机制
通信两端都有Socket,网络通信其实就是Socket间通信
数据在两个Socket间通过IO流传输
2.UDP传输
import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.InetAddress; import java.io.*; class Send { /* 1.建立UDP服务 创建DatagramSocket对象,实现发送端套接字(发送端端点),可以指定套接字端口,也可以不指定使用随机空闲端口 2.提供数据,并封装到数据到包中 创建DatagramPacket对象,指定传送的数据,访问的主机ip(封装到InetAddress对象中)和端口, 3.发送数据包 通过DatagramSocket对象的send方法发送数据包 4.关闭服务 */ public static void main(String[] args) throws Exception { DatagramSocket ds=new DatagramSocket(11010); byte[] bytes=new byte[1024]; int pos=0; InetAddress id=InetAddress.getByName("221.193.220.173"); BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); String line; while(true) { line=bf.readLine(); pos=0; for(byte b : line.getBytes()) { bytes[pos++]=b; if(pos==1024) break; } ds.send(new DatagramPacket(bytes,0,pos,id,11011)); if("over".equals(line)) break; } ds.close(); } } class Receive { /* 1.建立UDP服务 创建DatagramSocket对象,实现接收端套接字,必须指定套接字端口 2.定义数据包 创建DatagramPacket对象,定义数据包用来接收数据 3.接收数据 DatagramSocket对象的receive方法接收数据包 4.处理数据 DatagramPacket对象中 getAddress方法可以获得数据包中的InetAddress对象,该对象是客户端封装的数据包中的 getData获取保重的缓存数据 getLength获取缓存数据的长度 5.关闭服务 */ public static void main(String[] args) throws Exception { //1.建立本机接受数据的端点 DatagramSocket ds=new DatagramSocket(11011); //2.定义数据包,存储数据 byte[] bytes=new byte[1024]; DatagramPacket dp=new DatagramPacket(bytes,bytes.length); String line; while(true) { //3.接收数据 ds.receive(dp); //4.处理数据 line=new String(dp.getData(),0,dp.getLength()); System.out.println(dp.getAddress().getHostAddress()+" : "+line); if("over".equals(line)) break; } //关闭服务 ds.close(); } }
3.TCP传输
import java.net.*; import java.io.*; class TCPClient { /* 1.建立tcp客户端服务 创建Socket对象,实现套接字,指定服务端主机ip和端口,建立连接。 2.建立io流 通过Socket获取InputStream对象和OutputStream对象进行数据的读写。 注:OutputStream对象对流进行输出,目的为网络流,对应的服务端读取状态是一个阻塞状态。 3.关闭tcp客户端服务 */ public static void main(String[] args) throws Exception { Socket s=new Socket("221.193.238.214",11010); BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String line; while(true) { line=br.readLine(); bw.write(line,0,line.length()); bw.newLine(); bw.flush(); if("over".equals(line)) { s.shutdownOutput(); break; } } //s.close(); } } class TCPServer { /* 1.建立tcp服务端服务 创建ServerSocket对象,实现服务端套接字,指定套接字的端口。 2.建立连接 ServerSocket对象的accept方法可以获取客户端(客户端实现了套接字时)套接字,这是一个阻塞状态。 3.建立io流 通过客户端套接字获取InputStream对象和OutputStream对象进行数据读写。 注;与客户端对应,客户端的数据读取状态也是一个阻塞状态。 4.关闭服务 通过客户端套接字可以关闭客户端服务。 通过服务端套接字可以关闭服务端服务。 */ public static void main(String[]args) throws Exception { ServerSocket ss=new ServerSocket(11010); Socket s=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); String line; String ip=s.getAddress().getHostAddress(); while((line=br.readLine())!=null) System.out.println(line); ss.close(); } }