现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。
在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。InetAddress getByName(String host): 在给定主机名的情况下确定主机的ip地址。
InetAddress getLocalHost():返回本地主机。InetAddress[] getAllByName(String host);
ip.getHostAddress()ip.getHostName()
Eg: package com.li.net; import java.net.InetAddress; public class Demo1 { public static void main(String[] args) throws Exception { InetAddress i = InetAddress.getLocalHost(); System.out.println(i); i = InetAddress.getByName("www.baidu.com"); System.out.println(i); System.out.println(i.getHostAddress()); System.out.println(i.getHostName()); } } 输出: XP-201706252326/10.6.147.2 www.baidu.com/61.135.169.105 61.135.169.105 www.baidu.com
TCP是面向连接的,有比较高的可靠性,一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等,而 UDP是面向无连接的,使用这个协议的常见服务有DNS、SNMP、QQ等。
UDP是一种面向无连接的通信协议,该协议使得数据传输的速度得到大幅度的提高。视频聊天语音聊天基本都是用UDP协议。1、将数据源和目的地封装到数据包中,不需要建立连接
2、每个数据包的大小限制在64k以内
3、因无连接,是不可靠协议
4、不需要建立连接,速度快
例子:聊天、对讲机就是UDP的,面向无连接(不管在不在,知不知道,只管发送,求速度),丢数据也不管。速度快。数据被分成包
TCP:
1、建立连接,形成传输数据的通道
2、在连接中进行大量数据的传输
3、通过三次握手完成连接、是可靠协议4、必须建立连接,效率会稍低
例子:电话通话,必须连接,对方同意才可以发送数据(不然就等待),不能丢失数据。
DatagramPacket类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。
通过这个对象中的方法,就可以获取到数据包中的各种信息。 byte[] getData()int getLength()
int getPort()setData(byte[]
setPort()receive(DatagramPacket)
send(DatagramPacket)udp的发送端
①:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。②:明确要发送的具体数据。
③:将数据封装成了数据包。
④:用socket服务的send方法将数据包发送出去。⑤:关闭资源。
发送端(客户端) import java.net.*; class UdpSend { public static void main(String[] args)throws Exception { // 1,建立udp的socket服务。 DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。 // 2,明确要发送的具体数据。 String text = "udp传输演示 哥们来了"; byte[] buf = text.getBytes(); // 3,将数据封装成了数据包。 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000); // 4,用socket服务的send方法将数据包发送出去。 ds.send(dp); // 5,关闭资源。 ds.close(); } } udp的接收端①:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。
②:定义数据包,用于存储接收到数据。
③:通过socket服务的接收方法将收到的数据存储到数据包中。④:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
⑤:关闭资源。接收端(服务器端)
import java.net.*; class UdpRece { public static void main(String[] args) throws Exception { // 1,创建udp的socket服务。 DatagramSocket ds = new DatagramSocket(10000); //必须指定,并且和上面的端口号一样! // 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); // 3,通过socket服务的接收方法将收到的数据存储到数据包中。 ds.receive(dp); //该方法是阻塞式方法。 // 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(),0,dp.getLength()); //将字节数组中的有效部分转成字符串。 System.out.println(ip+":"+port+"--"+text); // 5,关闭资源。 ds.close(); }}
通过键盘录入获取要发送的信息。
将发送和接收分别封装到两个线程中。 package com.li.net; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; //客户端,发送端 class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds) { super(); this.ds = ds; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//数据源是键盘录入 String line; while ((line = br.readLine()) != null) { byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 10225); ds.send(dp); } } catch (IOException e) { e.printStackTrace(); } } } // 服务器端,接收端 class Rece implements Runnable { private DatagramSocket ds; public Rece(DatagramSocket ds) { super(); this.ds = ds; } @Override public void run() { try { while (true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, 0, buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + " " + data); } } catch (Exception e) { e.printStackTrace(); } } } public class Demo6 { public static void main(String[] args) throws Exception { DatagramSocket sendDs = new DatagramSocket(); DatagramSocket receDs = new DatagramSocket(10225); new Thread(new Send(sendDs)).start(); new Thread(new Rece(receDs)).start(); } } 输出: 你好 127.0.0.1 你好 你好 127.0.0.1 你好setSoTimeout(int)
Socket accept()close()
Socket(IP地址, 端口) - 构造器
getInputStream()getOutputStream()
getChannel()
close()
