网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
java socket 类分为:ServerSocket、Socket,即服务器端和客户端。这两个类都属于,java.net包中。
Socket()
Socket(InetAddress address, int port) throws UnknowHostException, IOException
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
Socket(String host, int port) throws UnknowHostException, IOException
Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
除了第一个不带参数的构造方法以外, 其他构造方法都会试图建立与服务器的连接, 如果连接成功, 就返回 Socket对象; 如果因为某些原因连接失败, 就会抛出IOException. InetAddress是一个用于记录主机的类,其静态getHostByName(String msg)可以返回一个实例,其静态方法getLocalHost()也可以获得当前主机的IP地址,并返回一个实例。Socket(String host, int port, InetAddress localAddress, int localPort)构造函数的参数分别为目标IP、目标端口、绑定本地IP、绑定本地端口。
getInetAddress(); 远程服务端的IP地址
getPort(); 远程服务端的端口
getLocalAddress() 本地客户端的IP地址
getLocalPort() 本地客户端的端口
getInputStream(); 获得输入流
getOutStream(); 获得输出流
值得注意的是,在这些方法里面,最重要的就是getInputStream()和getOutputStream()了
isClosed(); //连接是否已关闭,若关闭,返回true;否则返回false
isConnect();//如果曾经连接过,返回true;否则返回false
isBound(); //如果Socket已经与本地一个端口绑定,返回true;否则返回false
ServerSocket()throws IOException
ServerSocket(int port)throws IOException
ServerSocket(int port, int backlog)throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException
public static void main(String[] args) {
try {
// 建立服务器连接
ServerSocket server = new ServerSocket(4578);
System.out.println("服务器启动");
// 等待客户连接
Socket socket = server.accept();
try {
// 读取客户端传过来信息的DataInputStream
DataInputStream in = new DataInputStream(socket
.getInputStream());
// 向客户端发送信息的DataOutputStream
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
// 获取控制台输入的Scanner
Scanner scanner = new Scanner(System.in);
while (true) {
// 读取来自客户端的信息
String accpet = in.readUTF();
System.out.println(accpet);
String send = scanner.nextLine();
System.out.println("服务器:" + send);
// 把服务器端的输入发给客户端
out.writeUTF("服务器:" + send);
}
} finally {// 建立连接失败的话不会执行socket.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
// 连接到服务器
Socket socket = new Socket(InetAddress.getLocalHost(), 4578);
try {
// 读取服务器端传过来信息的DataInputStream
DataInputStream in = new DataInputStream(socket
.getInputStream());
// 向服务器端发送信息的DataOutputStream
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
// 装饰标准输入流,用于从控制台输入
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("输入:");
String send = scanner.nextLine();
System.out.println("客户端:" + send);
// 把从控制台得到的信息传送给服务器
out.writeUTF("客户端:" + send);
// 读取来自服务器的信息
String accpet = in.readUTF();
System.out.println(accpet);
}
} finally {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}