理解socket
1、socket即为套接字,在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。
2、在TCP协议中,建立连接的两个进程(客户端和服务器)各自有一个socket来标识,则这两个socket组成的socket pair就唯一标识一个连接。
3、socket本身就有“插座”的意思,因此用来形容网络连接的一对一关系,为TCP/IP协议设计的应用层编程接口称为socket API。
TCP程序设计
进行TCP网络编程需要使用两个类:①Socket:客户端套接字,②ServerSocket:服务器套接字类,不过,注意:套接字的实际工作由SocketImpl类的实例执行;
基于套接字的网络编程一般包括以下基本步骤:
1、创建Socket;
2、打开连接到Socket的输入/输出流;
3、按照一定的协议对Socket进行读/写操作;
4、关闭打开的输入/输出流;
5、关闭Socket;
Socket类
1、创建Socket对象
//address、host、port分别是双向连接中另一方的IP地址、主机名、端口号
//localAddr、localport分别是本机的IP地址和端口号
Socket(InetAddress address,int port);
Socket(String host,int port);
Socket(InetAddress address,int port,InetAddress localAddr,int localport);
Socket(String host,int port,,InetAddress localAddr,int localport);
Socket(); //创建一个为连接的套接字
如果使用Socket()创建一个为连接的套接字,则可以使用connect()方法,连接到指定的目标主机:
connect(InetAddress endpoint);//指定目标主机
connect(InetAddress endpoint,int timeout);//指定目标主机和超时
2、打开连接到的Socket的输入/输出流
方法 | 作用 |
---|---|
getInputStream() | 返回套接字的输入流 |
getOutputStream() | 返回套接字的输出流 |
3、关闭Socket
close();
ServerSocket类
1、创建对象
// port要绑定的端口号、backlog队列长度(即支持的最大连接数)binAddr要绑定的另一方额的IP地址
ServerSocket(int port);
ServerSocket(int port,int backlog);
ServerSocket(int port,int backlog,InetAddress bindAddr);
2、重要方法
accept():
阻塞方法,侦听并接受客户端的连接,若连接成功,则创建一个套接字;
基于TCP的一对一、一对多的TCP通信程序
UDP程序设计
TCP的所以操作都必须建立可靠的连接,这样肯定会浪费大量的系统资源,为了减少花销还可以使用另一种传输协议——UDP,UDP协议是一种非面向连接的协议,就是不管对方状态就直接发送,而不管对方是否可以接收到这些数据,因此也说UDP协议是一种不可靠的协议,它更适合于一次只传输少量数据、对可靠性要求不高的应用环境,UDP相比于TCP通信效率更高,但可靠性不如TCP;
用于UDP程序开发的主要有两个类:
DatagramPacket:表示数据包
DatagramSocket:数据报套接字,用于创建接收或发送数据报的Socket对象,
1、创建DatagramPacket对象
DatagramPacket(byte[] buf,int length); //接收长度为length的数据包
//接收长度为length的、偏移量为offest的数据包
DatagramPacket(byte[] buf,int offest,int length);
//将长度为length的、偏移量为offest的数据包发送到指定主机上的指定端口
DatagramPacket(byte[] buf,int length,InetAddress addres,int port);
DatagramPacket(byte[] buf,int offest,int length,InetAddress addres,int port);
2、创建DatagramSocket对象
DatagramSocket();//创建数据报套接字,将其绑定到本地主机上任何可用的端口
DatagramSocket(int port);//创建数据报套接字,将其绑定到本地主机上指定的端口
DatagramSocket(int port,InetAddress laddr);//创建数据报套接字,将其绑定到指定的本地地址
3、写入和读取DatagramPacket对象
创建一个DatagramPacket对象后,可以调用DatagramPacket对象的各种方法来写入和读取数据包;
方法 | 作用 |
---|---|
setAddress(InetAddress iaddr) | 设置目标机的IP地址 |
setPort(int port) | 设置目标机的端口号 |
setData(byte[] buf) | 设置数据缓冲区 |
getAddress() | 获取IP地址(发送数据包为目标主机,接收数据包为源主机) |
getPort() | 获取端口号(发送数据包为目标主机,接收数据包为源主机) |
byte[] getData() | 获取数据缓冲区 |
4、发送数据
使用DatagramPacket和DatagramSocket发送数据的基本步骤如下:
①准备要发送的数据(字节数组byte[] buf、偏移量offset、长度length);
②创建指向目标主机(IP地址)的InetAddress对象;
③创建DatagramPacket对象(指定要发送的数据、目标主机IP地址和端口号);
④创建DatagramSocket对象
⑤使用DatagramSocket对象的send(packet)
方法发送创建的数据包;
5、接收数据
使用DatagramPacket和DatagramSocket接收数据的基本步骤如下:
①确定要接收的数据的字节数组(字节数组byte[] buf、偏移量offset、长度length);
②创建DatagramPacket对象(指定要接收的数据的字节数组、偏移量、长度);
③创建DatagramSocket对象(指定本地主机IP地址和端口号);
④使用DatagramSocket对象的receive(packet)
方法等待数据包的到来,并将接收到的数据包放置在packet中;
⑤处理接收到的数据包的内容;