基于TCP协议的网络通信
**重点内容**1.使用InetAddress(IP地址类)
这个类有点儿奇葩,没有提供构造方法。而是有两个静态方法来实例化。
·getByName(String host) 通过主机名获取对应的InetAddress对象
·getByAddress(byte[] addr) 通过IP地址获取对应的InetAddress对象
getCononicalHostName() 获取IP地址的全限定域名
getHostAddress() 返回IP地址字符串
getHostName() 获取IP地址的主机名
getLocalHost() 获取本机IP地址对应的InetAddress实例
获取本机的IP地址:
InetAddress address = InetAddress.getLocalHost(); String ipAddr = address.getHostAddress(); System.out.println(ipAddr);
2.基于TCP协议的网络编程
在通信的两端各建立一个Socket,从而在两点之间形成一个虚拟的网络链路。两端的程序就可以通过虚拟链路进行通信。
Java使用Socket对象来代表两端的通信端口,并通过Socket产生的IO流来进行网络通信。
IP协议: 负责将消息从一个主机传送到另一个主机,消息在传送过程中被分割成了一个个的小包。
不能解决数据分组在传输过程中可能出现的问题。为了无差错。引入TCP协议。
TCP协议:端对端的协议,两台主机连接的时候,TCP协议为他们建立了一个连接:发送和接受数据的虚拟链路(Socket)
可以正确的把数据传输到另一端。因为,当数据传输到另一端的时候,接受端会发送一条确认消息。如果没有收到确认消息的话,则会重发。
使用ServerSocket创建TCP服务器端
用于监听来自客户端的Socket连接,如果没有连接,它会一直处于等待状态。
监听来自客户端连接请求的方法:
Socket accept() 接收到Socket请求,将会返回一个与客户端请求相对应的Socket。
创建ServerSocket
ServerSocket(int port) 指定端口创建一个ServerSocket
使用完毕后,调用ServerSocket的close方法来关闭Socket。
为了能够一直接收客户端请求,通常把accept放在死循环中
示例:ServerSocket ss = new ServerSocket(20000);
while(true)
{
Socket socket = ss.accept();
//通过Socket进行通信
}
ss.close();
使用Socket进行通信
在客户端直接使用Socket对象。
Socket(InetAddress,int port)
创建连接到远程主机,远程端口的Socket
例如: Socket s = new Socket(“192.1.1.168”,30000);
getInputStream 输入流 从Socket中取出数据
getOutputStream 输出流 向Socket输出数据
示例: 通过本地主机作为服务端向手机发送消息
ServerSocket ss = new ServerSocket(6500); while(true) { //获取相应端口号的Socket Socket s = ss.accept(); //获取输出流 OutputStream os = s.getOutputStream(); os.write(你好吖~.getBytes(utf-8)); os.close(); s.close(); }
手机作为客户端接收信息
//此处的IP地址应该是服务端的IP,端口号也要和服务端的端口相同 Socket socket = new Socket(192.168.1.1,6500); InputStream is = socket.getInputStream(); //之后就是正常的IO操作,不写了~~