术语网络编程是指编写跨多个设备(计算机)执行的程序,其中所有设备都使用网络彼此连接。
提供了对两个常见网络协议的支持
TCP - tcp代表可靠传输控制协议。
UDP - udp代表用户数据报协议,这是一种允许在应用程序之间传输数据包的无连接协议。
Socket使用TCP提供两台计算机之间的通信机制,客户端程序在其通信结束时创建Socket,并尝试将该Socket连接到服务器。
java.net.Socket类表示Socket,java.net.ServerSocket类为服务器程序提供一种机制来侦听客户端并与它们创建连接。
TCP是双向通信协议,因此可以同时通过两个流发送数据。以下是提供实现Socket的完整方法集的有用类。
java.net.ServerSocket类由服务器应用程序用于获取端口并侦听客户端请求,ServerSocket类有四个构造函数-
Sr.No. | Method & Remark |
---|---|
1 | public ServerSocket(Int Port) throws IOException 尝试创建绑定到指定端口的服务器Socket,如果端口已经被另一个应用程序绑定,则会发生异常。 |
2 | public ServerSocket(int port,int backlog) throws IOException 与前面的构造函数类似,backlog参数指定在等待队列中存储多少传入客户端。 |
3 | public ServerSocket(int port,int backlog,InetAddress address) throws IOException 与前面的构造函数类似,InetAddress参数指定要绑定到的本地IP地址。InetAddress用于可能具有多个IP地址的服务器,允许服务器指定接受客户端请求的IP地址。 |
4 | public ServerSocket() throws IOException 创建未绑定的服务器Socket。使用此构造函数时,请在准备好绑定服务器Socket时使用bind()方法。 |
如果ServerSocket构造函数未引发异常,则表示您的应用程序已成功绑定到指定的端口,并且已准备好接受客户端请求。
下面是ServerSocket类-的一些常用方法
Sr.No. | Method & Remark |
---|---|
1 | public int getLocalPort() 链接:https://www.learnfk.comhttps://www.learnfk.com/java/java-networking.html 来源:LearnFk无涯教程网 返回服务器Socket正在侦听的端口。如果您在构造函数中将0作为端口号传入,并让服务器为您查找端口,则此方法很有用。 |
2 | public Socket Accept() throws IOException 等待传入的客户端。如果已使用setSoTimeout()方法设置了超时值,则此方法将一直阻塞,直到客户端连接到指定端口上的服务器或Socket超时。否则,此方法将无限期阻止。 |
3 | public void setSoTimeout(Int Timeout) 设置在Accept()期间服务器Socket等待客户端的超时值。 |
4 | public void bind(SocketAddress host,int backlog) 将Socket绑定到SocketAddress对象中的指定服务器和端口。如果已经使用无参数构造函数实例化了ServerSocket,请使用此方法。 |
当ServerSocket调用Accept()时,该方法在客户端连接之前不会返回。客户端连接后,ServerSocket在未指定的端口上创建一个新Socket,并返回对此新Socket的引用。客户端和服务器之间现在存在TCP连接,可以开始通信。
java.net.Socket类表示客户端和服务器用于相互通信的Socket。客户端通过实例化一个Socket对象 获得一个Socket对象 ,而服务器从Accept()方法的返回值获得一个Socket对象 。
Socket类有五个构造函数,客户端使用它们连接到服务器-
Sr.No. | Method & Remark |
---|---|
1 | public Socket(String host,int port) throws Unknown nHostException,IOException。 此方法尝试连接到指定端口处的指定服务器。如果此构造函数未引发异常,则连接成功,并且客户端连接到服务器。 |
2 | public Socket(InetAddress host,int port )throws IOException 此方法与前面的构造函数相同,不同之处在于宿主由InetAddress对象表示。 |
3 | public Socket(String host,int port,InetAddress localAddress,int localPort) throws IOException。 连接到指定的主机和端口,在指定地址和端口的本地主机上创建Socket。 |
4 | public Socket(InetAddress host,int port,InetAddress localAddress,int localPort) throws IOException。 此方法与前面的构造函数相同,不同之处在于主机由InetAddress 对象而不是字符串表示。 |
5 | public Socket() 创建未连接的Socket。使用connect()方法将此Socket连接到服务器。 |
当Socket构造函数返回时,它不会简单地实例化Socket 对象 ,而是实际尝试连接到指定的服务器和端口。
下面列出了Socket类中感兴趣的一些方法。请注意,客户端和服务器都有一个Socket 对象 ,因此客户端和服务器都可以调用这些方法。
Sr.No. | Method & Remark |
---|---|
1 | public void connect(SocketAddress host,int timeout) throws IOException 此方法将Socket连接到指定的主机。仅当使用无参数构造函数实例化Socket时,才需要此方法。 |
2 | public InetAddress getInetAddress() 此方法返回此Socket连接到的另一台计算机的地址。 |
3 | public int getPort() 返回远程计算机上Socket绑定到的端口。 |
4 | public int getLocalPort() 链接:https://www.learnfk.comhttps://www.learnfk.com/java/java-networking.html 来源:LearnFk无涯教程网 返回本地计算机上Socket绑定到的端口。 |
5 | public SocketAddress getRemoteSocketAddress() 返回远程Socket的地址。 |
6 | public InputStream getInputStream() throws IOException 返回Socket的输入流,输入流连接到远程Socket的输出流。 |
7 | public outputStream getOutputStream() throws IOException 返回Socket的输出流,输出流连接到远程Socket的输入流。 |
8 | public void close() throws IOException 关闭Socket,这使此Socket对象不再能够再次连接到任何服务器。 |
此类表示Internet协议(IP)地址。下面是在进行Socket编程-时需要使用的以下方法
Sr.No. | Method & Remark |
---|---|
1 | static InetAddress getByAddress(byte[]addr) 返回给定原始IP地址的InetAddress对象 。 |
2 | static InetAddress getByAddress(string host,byte[]addr) 基于提供的主机名和IP地址创建InetAddress。 |
3 | static InetAddress getByName(String host) 在给定主机名称的情况下,确定主机的IP地址。 |
4 | string getHostAddress() 返回文本表示形式的IP地址字符串。 |
5 | string getHostName() 获取此IP地址的主机名。 |
6 | static InetAddress getLocalHost() 返回本地主机。 |
7 | string toString() 将此IP地址转换为字符串。 |
下面的GreetingClient是一个客户端程序,它使用Socket连接到服务器并发送问候语,然后等待响应。
//File Name GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); } catch (IOException e) { e.printStackTrace(); } } }
下面的GreetingServer程序是一个服务器应用程序示例,它使用Socket类侦听由命令行参数-指定的端口号上的客户端
//File Name GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); } catch (SocketTimeoutException s) { System.out.println("Socket timed out!"); break; } catch (IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.start(); } catch (IOException e) { e.printStackTrace(); } } }
编译客户端和服务器,然后启动服务器,如下所示-
$java GreetingServer 6066 Waiting for client on port 6066...
检查客户端程序,如下所示-
$java GreetingClient localhost 6066 Connecting to localhost on port 6066 Just connected to localhost/127.0.0.1:6066 Server says Thank you for connecting to /127.0.0.1:6066 Goodbye!
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)