1、什么是网络编程?
网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。
2.IP和端口
解决了文章最开始提到的定位的问题。
IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证);网络编程是和远程计算机的通信,所以必须先能定位到远程计算机;IP帮助解决此问题;一台计算机中可能有很多进程,具体和哪一个进程进行通信,这就得靠端口来识别;
IP和端口能唯一定位到需要通信的进程。这里的IP表示地址,区别于IP协议。在OSI体系还是TCP/IP体系中,IP协议位于网际层,来封装IP地址到报
2.1IP常用方法
如:
InetAddress i = InetAddress.getLocalHost();
System.out.println(i);
System.out.println(i.getHostName());//获取主机名
System.out.println(i.getHostAddress());//获取主机IP地址
InetAddress ia = InetAddress.getByName("10.172.5.195");//获取主机地址为10.172.5.195的信息
System.out.println(ia.getHostName());
System.out.println(ia.getHostAddress());
3.TCP和UDP
TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
一、UDP特点:
1、将数据源和目的地封装到数据包中,不需要建立连接
2、每个数据包的大小限制在64k以内
3、因无连接,是不可靠协议
4、不需要建立连接,速度快
例子:聊天、对讲机就是UDP的,面向无连接(不管在不在,知不知道,只管发送,求速度),丢数据也不管。速度快。数据被分成包
如:UDP发送端
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public class ip2 {
public static void main(String[] args) throws IOException{
//创建udp服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//确定数据,并封装成数据包
byte[] b = "wo hen hao".getBytes();
DatagramPacket dp =
new DatagramPacket(b,b.length,InetAddress.getByName("10.172.8.174"),10001);
//通过send方法发送出去
ds.send(dp);
//关闭资源
ds.close();
}
}</span>
<span style="font-size:18px;background-color: rgb(255, 255, 255);">UDP接收端</span>
<span style="font-size:18px;background-color: rgb(255, 255, 255);"><pre name="code" class="java"><pre name="code" class="java">public class ip3 {
public static void main(String[] args) throws IOException{
//1.创建UDP Socket,建立端点
DatagramSocket ds = new DatagramSocket(10001);//定义了一个标示端口
//2.定义数据包,用于存储数据
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
//3.通过服务的receive方法将受到的数据存入数据包中
ds.receive(dp);
//4.通过数据包的方法获取其中的数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());;
int port = dp.getPort();
System.out.println(data);
//关闭资源
ds.close();
}
}</span>
二、TCP特点:
1、建立连接,形成传输数据的通道
2、在连接中进行大量数据的传
3、通过三次握手完成连接、是可靠协议
4、必须建立连接,效率会稍低
例子:电话通话,必须连接,对方同意才可以发送数据(不然就等待),不能丢失数据。
如:TCP客户端
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public class ip4 {
//tcp客户端连接
public static void main(String[] args) throws IOException{
//创建客户端的socket服务,指定目的主机和端口
Socket s = new Socket("10.172.8.174",10003);
//为了发送数据,应该获取socket流中的输出流
OutputStream o = s.getOutputStream();
o.write("tcp lian jie".getBytes());
s.close();
}
}</span>
<span style="font-size:18px;background-color: rgb(255, 255, 255);">TCP服务器:</span>
<span style="font-size:18px;background-color: rgb(255, 255, 255);"><pre name="code" class="java">public class ip5 {
//tcp服务端接收数据
public static void main(String[] args) throws Exception{
//建立服务端socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10005);
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端
}
</span>
}
4.Socket
Socket是网络驱动层提供给应用程序编程接口和一种机制。
Socket 是在应用程序中创建的,它是通过一种绑定机制与驱动程序建立关系,告诉自己所对应的 IP 和 Port。在网络上传输的每一个数据帧,必须包含发送者的 IP 地址和端口号。创建完 Socket 以后,应用程序写入到 Socket 的数据,由 Socket 交给驱动程序向网络上发送数据,计算机从网络上收到与某个 Socket 绑定的 IP 和 Port 相关的数据后,由驱动程序再交给 Socket ,应用程序就可以从这个 Socket 中读取接收到的数据。网络应用程序就是这样通过 Socket 发送和接收的。