网络编程入门
-
网络编程是在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换。
-
网络编程三要素: IP地址:为每台计算机指定一个标识,通过标识号来指定要接收数据的计算机和识别发送的计算机,而Ip地址就是标识号(设备标识)。端口:是应用程序的标识,网络通信是应用程序通信,计算机有多个程序,通信时需要端口区分。 协议:通过计算机网络使多台计算机连接,位于同一个网络中的计算机进行连接和通信需要遵守一定规则(网络通信协议),它对数据传输格式,速率,步骤有统一规定,通信双方同时遵守才能完成数据交换。常见协议有UDP协议和TCP协议。
-
IP地址(IP v4 IP v6):常用命令:ipconfig:查看本机IP地址 ping IP地址:检查网络是否连通
-
InetAddress的使用:为了方便对IP地址的获取和操作,Java提供了一个类InetAddress使用。
InetAddress:此类表示Internet协议(IP)地址
方法名 | 说明 |
---|---|
static InetAddress getByName(String host) | 确认主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址 |
String getHostName() | 获取此IP地址的主机名 |
String getHostAddress() | 返回文本显示中的IP地址字符串 |
public class InetAddressDemo{ public static void main(String[] args) throws UnknownHostExcetion{ //确定主机名称IP地址 InetAddress address = InetAddress.getByName("192.168.1.66"); //获取IP地址主机名 String name = address.getHostName(); //返回文本显示中IP地址字符串 String ip = address.getHostAddress(); System.out.println("主机名:"+name); System.out.println("IP地址:"+ip); } }
-
端口是设备上应用程序的唯一标识
端口号是用两个字节表示的整数,取值范围是0~65535,其中0~1023之间的端口号用于一些知名的网络服务和应用,普通程序需要使用1024以上的端口号,如果端口号被占用,会导致当前程序启动失败。
-
协议是连接和通信的规则:UDP协议(用户数据报协议User Datagram Protocol)UDP是无连接通信协议,发送端和接收端不建立逻辑连接。发送到不会确认接收端是否存在就发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据(消耗资源小,通信效率高,用于音频,视频和普通数据传输)
TCP协议(传输控制协议Transmission Control Protocol)是面向连接的通信协议,在传输数据之前,在发送到和接收端建立逻辑连接,然后传输数据,提供可靠无差错的数据传输。连接要明确客户端和服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要经过“三次握手” (1 客户端发出连接请求,等待确认 2 服务器端回送响应,通知客户端收到连接请求 3 客户端再次发送确认信息,确认连接)上传,下载文件和浏览网页等。
//UDP协议 public class SendDemo{ public static void main(String[] args) throws IOException{ //创建发送端Socket对象 //DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口 DatagramSocket ds = new DatagramSocket(); //DatagramPacket(byte[] buf,int length, InerAddress address, int port) //构造数据包,发送长度为length的数据包到指定主机上的指定端口号 byte[] bys = "hello,udp,我来了".getBytes(); int length = bys.length; InetAddress address = InetAddress.getByName("192.168.1.16"); int port = 10086; DatagramPacket dp = new DatagramPacket(bys,length,address,port); //调用DatagramSocket对象方法发送数据 //void send (DatagramPacket p)从此套接字发送数据报包 ds.send(dp); //关闭发送端 ds.close(); } } public class ReceiveDemo{ public static void main(String[] args) throws IOException{ //创建接收端Socket对象 //构造数据报套接绑定到本地主机上指定端口 DatagramSocket ds = new DatagramSocket(10086); //创建数据包,接收数据 byte[] bys = new byte[1024]; DatagramPacker dp = new DatagramPacker(bys,bys.length); //调用DatagramSocket对象方法接收数据 ds.receive(dp); byte[] datas = dp.getData(); int len = dp.getLength(); String dataString = new String(datas,0,len); System.out.println("数据是:"+dataString); //关闭接收端 ds.close(); }
//TCP协议 //TCP发送数据 public class ClientDemo{ public static void main(String[] args) throws IOException{ //创建客户端Socket对象 Socket s = new Socket("192.168.1.66",10000); //获取输出流,写数据 OutputStream os s.getOutputStream(); os.write("hello,tcp,我来了".getBytes()); //释放资源 s.close(); } } //TCP接收数据,服务器端 public class ServerDemo{ public static void main(String[] args) throws IOException{ //创建服务器端的Socket对象 ServerSocket ss = new ServerSocket(10000); //侦听要连接到此套接字并接受它 Socket s = ss.accept(); //获取输入流,读数据,把数据显示在控制台 InputStream is = s.getInputStream(); byte[] bys = new byte[1024]; int len = is.read(bys); String data = new String(bys,0,len); System.out.println("数据是:"+data); //释放资源 s.close(); ss.close(); } }
-
案例:UDP发送数据(数据来自键盘录入,直到输入数据886,结束) UDP接收数据(不知道发送端停止时间,采用死循环接收)
public class SendDemo{ public static void main(String[] args) throws IOException{ //创建发送端Socket对象 DatagramSocket ds = new DatagramSocket(); //自己封装键盘录入数据 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = br.readLine())!=null){ if("886".equals(line)){ break; } byte[] bys = line.getBytes(); DatagramPacket dp=new DatagramPacker(bys,bys.length,InetAddress.getByName("192.168.1.16"),12345); //调用DatagramSocket对象方法发送数据 ds.send(dp); } //关闭发送端 ds.close();}} //接收端 public class ReceiveDemo{ public static void main(String[] args) throws IOException{ //创建接收端Socket对象 DatagramSocket ds = new DatagramSocket(12345); while(true){ byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys,bys.length); ds.receive(dp); //解析数据包,并把数据在控制台显示 System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength())); //不需要关闭接收端ds.close; }