Socket
- 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
- Socket通常用来实现 client-server 连接。
- java.net 包中定义的两个类 Socket 和 ServerSocket ,分别用来实现双向连接的 client 和 server 端。
- 建立连接时所需的寻址信息为远程计算机的 IP 地址和端口号(Port number)。
Tcp Socket 通信模型
Socket使用示例:
public class Test { public static void main(String[] args) throws IOException{ try (Socket s = new Socket("time-A.timefreq.bldrdoc.gov", 13)){ //打开一个套接字 InputStream inStream = s.getInputStream(); //返回一个InputStream对象 Scanner in = new Scanner(inStream); while(in.hasNextLine()){ String line = in.nextLine(); System.out.println(line); } } } }
Socket对象:
- Socket(String host, int port):构建一个套接字,用来连接给定的主机和端口;该方法会一直无限期阻塞下去,直到建立了到达主机的初始连接为止;
- InputStream getInputStream():获取可以从套接字中读取数据的流;
- OutputStream getOutputStream():获取可以向套接字中写出数据的流;
- Socket():创建一个还未被连接的套接字;
- void connect(SocketAddress address):将该套接字连接到给定的地址;
- void connect(SocketAddress address, int timeoutInMilliseconds):将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回;
- void setSoTimeout(int timeoutInMilliseconds):设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个InterruptedIOException异常;
- boolean isConnected():如果该套接字已被连接,则返回true;
- boolean isClosed():如果该套接字已经被关闭,则返回true;
Socket s = new Socket(); s.connect(new InetSocketAddress(host, port), timeout); //InetSocketAddress是SocketAddress的实现子类,SocketAddress是一个抽象类
InetAddress对象:
- static InetAddress getByName(String host)
- static InetAddress[] getAllByName(String host):为给定的主机名创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组;
- static InetAddress getlocalHost():为本地主机创建一个InetAddress对象;
- byte[] getAddress():返回一个包含数字型地址的字节数组;
- String getHostAddress():返回一个由十进制数组成的字符串,个数字间用圆点符号隔开,例如"132.163.4.102";
- String getHostName():返回主机名;
InetAddress address = InetAddress.getByName(""time-A.timefreq.bldrdoc.gov"");//返回一个InetAddress对象,该对象封装了一个4字节的序列:132.163.4.104 byte[] addressBytes = address.getAddress(); InetAddress[] addresses = InetAddress.getAllByName(host); InetAddress address = InetAddress.getLocalHost();
ServerSocket对象:
- ServerSocket(int port):创建一个监听端口的服务器套接字;
- Socket accept():等待连接。该方法阻塞(即使之空闲)当前线程直到建立连接为止。该方法返回一个Socket对象,程序可以通过这个对象与连接中的客户端进行通信;
- void close():关闭服务器套接字;
C/S实例:
服务端
import java.net.*; import java.io.*; public class TCPServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(6666); while(true) { Socket s = ss.accept(); System.out.println("a client connect!"); DataInputStream dis = new DataInputStream(s.getInputStream()); System.out.println(dis.readUTF()); dis.close(); s.close(); } } }
客户端
import java.net.*; import java.io.*; public class TCPClient { public static void main(String[] args) throws Exception{ Socket s = new Socket("127.0.0.1", 6666); OutputStream os = s.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); Thread.sleep(30000); dos.writeUTF("hello server!"); dos.flush(); dos.close(); s.close(); } }