网络编程
1.1
网络编程基础知识
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
两类传输协议:tcp和udp
TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
下面我们对这两种协议做简单比较:
使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间。
使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。而TCP没有这方面的限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。而TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。
总之,TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。相比之下UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。
1.2
socket通信
网络编程三要素
1、 IP
IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识
2、 端口
应用程序都会对应一个端口,用来通信。一台计算机中可能有很多进程,具体和哪一个进程进行通信,这就得靠端口来识别
3、 协议
tcp/udp
TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连 接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
1.3
三要素详解:
特殊的ip地址
127.0.0.1 本地回环地址 用来做一些本地测试
ping IP地址 ; 用来检测本机是否可以和指定的IP地址的计算机可以进行正常通讯
ipconfig 用来查看IP地址
xxx.xxx.xxx.255 广播地址
端口号
物理端口 物理设备对应的端口 , 网卡口
逻辑端口 用来标示我们的计算机上的进程 , 端口号的有效范围应该是 0-65535 ,
其中0-1024被系统占用或者保留
协议
udp
把数据打成一个数据包 , 不需要建立连接
数据包的大小有限制不能超过64k
因为无连接,所以属于不可靠协议(可能丢失数据)
因为无连接 ,所以效率高
tcp
需要建立连接,形成连接通道
数据可以使用连接通道直接进行传输,无大小限制
因为有链接,所以属于可靠协议
因为有链接,所以效率低
1.4
InetAddress:IP地址的描述类
public static InetAddress getByName(String host)( host: 可以是主机名,也可以是IP地址的字符串表现形式)
public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。
public String getHostName()获取此 IP 地址的主机名。
1 public static void main(String[] args) throws Exception { 2 //通过主机ip获取InetAddress对象 3 InetAddress address = InetAddress.getByName("192.168.31.230"); 4 5 //public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。 6 System.out.println(address.getHostAddress()); 7 8 //public String getHostName()获取此 IP 地址的主机名。 9 System.out.println(address.getHostName()); 10 11 }
1.5
socket编程(也叫套接字编程,网络编程)
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
1.6
udp协议
UDP通信步骤:
发送端步骤:
/*
* UDP发送数据的步骤:
* A:创建UDP发送数据端Socket对象
* B:创建数据包,并给出数据,把数据打包
* C:通过Socket对象发送数据包
* D:释放资源
*/
接收端步骤:
/*
* UDP协议接收数据步骤:
* A:创建UDP接收数据端Socket对象
* B:创建一个接收数据的数据包
* C:接收数据,数据在数据包中
* D:解析数据包,并把数据显示在控制台
* E:释放资源
*/
1 public class UdpClient { 2 public static void main(String[] args) throws Exception { 3 //1.创建udp协议发送端的socket对象 4 //public DatagramSocket() throws SocketException 5 DatagramSocket ds = new DatagramSocket(); 6 7 byte[] buf = "hello".getBytes(); 8 int length = buf.length; 9 InetAddress address = InetAddress.getByName("192.168.20.254"); 10 int port = 8888; 11 12 //2.创建数据包 13 //public DatagramPacket(byte[] buf, int length,InetAddress address,int port) 14 DatagramPacket dp = new DatagramPacket(buf, length, address, port); 15 /** 16 * 1.你要发送的数据 17 * 2.发送的数据的长度 18 * 3.你要发送给的电脑ip 19 * 4.端口 20 */ 21 22 //发送数据 23 ds.send(dp); 24 25 //释放资源 26 ds.close(); 27 28 29 } 30 31 }
1 public class UdpServer { 2 public static void main(String[] args) throws Exception { 3 //创建接收端的socket对象 4 DatagramSocket ds = new DatagramSocket(9999); 5 6 //接受来自客户端的数据 7 while (true) { 8 //创建数据包 9 byte[] buf = new byte[1024]; 10 int length = buf.length; 11 DatagramPacket dp = new DatagramPacket(buf, length); 12 13 //接受来自客户端的数据 14 ds.receive(dp); 15 16 //解析数据包中的数据 17 byte[] data = dp.getData(); 18 int len = dp.getLength(); 19 System.out.println(new String(data, 0, len)); 20 21 } 22 23 } 24 25 }
以上列出了一个简单的例子
tcp协议
发送端:
/*
* TCP协议发送数据步骤:
* A:创建TCP协议发送端Socket对象
* 指定服务器IP及端口
Socket sk = new Socket("192.168.3.120" , 9527) ;
* B:获取输出流,并写数据
OutputStream outputStream = sk.getOutputStream() ;
outputStream.write("hello,TCP我来了".getBytes()) ;
* C:释放资源
sk.close() ;
*
* java.net.ConnectException: Connection refused: connect
* TCP协议是不能直接运行客户端的,必须先运行服务器。因为他是一种可靠的协议。
*/
接收端:
/*
* TCP协议接收数据步骤:
* A:创建TCP协议接收端Socket对象
ServerSocket ss = new ServerSocket(9527) ;
* B:监听客户端连接
Socket sk = ss.accept() ;
* C:获取输入流,并读取数据,显示在控制台
// 读取数据
byte[] bytes = new byte[1024] ;
int len = inputStream.read(bytes) ;
// public InetAddress getInetAddress()获取IP地址
InetAddress inetAddress = sk.getInetAddress() ;
String ip = inetAddress.getHostAddress() ;
// 输出
System.out.println(ip + "发来数据是: " + new String(bytes , 0 , len));
* D:释放资源
sk.close() ;
*/
1 public class TcpClient { 2 public static void main(String[] args) throws Exception { 3 //创建tcp协议发送端的socket对象 4 //public Socket(String host,int port) 5 Socket sk = new Socket("192.168.20.254", 10086); 6 7 //2.public OutputStream getOutputStream()throws IOException 8 //从通道中获取输出流对象 9 OutputStream os = sk.getOutputStream(); 10 11 //3.给通道中写数据 12 os.write("hello".getBytes()); 13 14 //4.释放资源 15 sk.close(); 16 17 } 18 19 }
1 public class TcpServer { 2 public static void main(String[] args) throws Exception { 3 //1.创建服务器端的sokeck对象 4 //public ServerSocket(int port)throws IOException 5 ServerSocket ss = new ServerSocket(10086); 6 7 //2.坚挺来自客户端的连接 8 //public Socket accept()throws IOException侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 9 Socket sk = ss.accept(); 10 11 //3.从通道中读取来自客户端的数据 12 InputStream is = sk.getInputStream(); 13 14 //4.读取is 15 byte[] buf = new byte[1024]; 16 int len = is.read(buf); 17 System.out.println(new String(buf, 0, len)); 18 19 //5.释放资源 20 sk.close(); 21 } 22 23 }