Java - 网络

Java - 网络 首页 / Java入门教程 / Java - 网络

术语网络编程是指编写跨多个设备(计算机)执行的程序,其中所有设备都使用网络彼此连接。

提供了对两个常见网络协议的支持

  • TCP     - tcp代表可靠传输控制协议。

  • UDP    - udp代表用户数据报协议,这是一种允许在应用程序之间传输数据包的无连接协议。

Socket使用TCP提供两台计算机之间的通信机制,客户端程序在其通信结束时创建Socket,并尝试将该Socket连接到服务器。

java.net.Socket类表示Socket,java.net.ServerSocket类为服务器程序提供一种机制来侦听客户端并与它们创建连接。

TCP是双向通信协议,因此可以同时通过两个流发送数据。以下是提供实现Socket的完整方法集的有用类。

ServerSocket方法

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连接,可以开始通信。

Socket方法

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对象不再能够再次连接到任何服务器。

InetAddress方法

此类表示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地址转换为字符串。

Socket客户端示例

下面的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();
      }
   }
}

Socket服务器示例

下面的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!

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

许式伟的架构课 -〔许式伟〕

编辑训练营 -〔总编室〕

性能测试实战30讲 -〔高楼〕

分布式协议与算法实战 -〔韩健〕

RPC实战与核心原理 -〔何小锋〕

乔新亮的CTO成长复盘 -〔乔新亮〕

如何落地业务建模 -〔徐昊〕

业务开发算法50讲 -〔黄清昊〕

结构执行力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)