📜  Java中的套接字编程

📅  最后修改于: 2022-05-13 01:54:50.787000             🧑  作者: Mango

Java中的套接字编程

本文描述了一个非常基本的单向客户端和服务器设置,其中客户端连接,向服务器发送消息,服务器使用套接字连接显示它们。为了让这些东西正常工作,需要进行很多低级的操作,但Java API 网络包 (Java.net) 负责所有这些,使程序员的网络编程非常容易。

客户端编程

建立套接字连接

要连接到另一台机器,我们需要一个套接字连接。套接字连接意味着两台机器拥有关于彼此的网络位置(IP 地址)和 TCP 端口的信息。 Java.net.Socket 类表示一个 Socket。要打开一个套接字:

Socket socket = new Socket(“127.0.0.1”, 5000)
  • 第一个参数 –服务器的 IP 地址。 ( 127.0.0.1 是 localhost 的 IP 地址,代码将在单机上运行)。
  • 第二个参数 – TCP Port 。 (只是一个数字,表示要在服务器上运行哪个应用程序。例如,HTTP 在端口 80 上运行。端口号可以从 0 到 65535)

沟通
为了通过套接字连接进行通信,流用于输入和输出数据。

关闭连接

一旦向服务器发送消息,套接字连接就会显式关闭。

在程序中,客户端不断读取用户的输入并将其发送到服务器,直到输入“Over”。

Java实现

Java
// A Java program for a Client
import java.net.*;
import java.io.*;
 
public class Client
{
    // initialize socket and input output streams
    private Socket socket            = null;
    private DataInputStream  input   = null;
    private DataOutputStream out     = null;
 
    // constructor to put ip address and port
    public Client(String address, int port)
    {
        // establish a connection
        try
        {
            socket = new Socket(address, port);
            System.out.println("Connected");
 
            // takes input from terminal
            input  = new DataInputStream(System.in);
 
            // sends output to the socket
            out    = new DataOutputStream(socket.getOutputStream());
        }
        catch(UnknownHostException u)
        {
            System.out.println(u);
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
 
        // string to read message from input
        String line = "";
 
        // keep reading until "Over" is input
        while (!line.equals("Over"))
        {
            try
            {
                line = input.readLine();
                out.writeUTF(line);
            }
            catch(IOException i)
            {
                System.out.println(i);
            }
        }
 
        // close the connection
        try
        {
            input.close();
            out.close();
            socket.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }
 
    public static void main(String args[])
    {
        Client client = new Client("127.0.0.1", 5000);
    }
}


Java
// A Java program for a Server
import java.net.*;
import java.io.*;
 
public class Server
{
    //initialize socket and input stream
    private Socket          socket   = null;
    private ServerSocket    server   = null;
    private DataInputStream in       =  null;
 
    // constructor with port
    public Server(int port)
    {
        // starts server and waits for a connection
        try
        {
            server = new ServerSocket(port);
            System.out.println("Server started");
 
            System.out.println("Waiting for a client ...");
 
            socket = server.accept();
            System.out.println("Client accepted");
 
            // takes input from the client socket
            in = new DataInputStream(
                new BufferedInputStream(socket.getInputStream()));
 
            String line = "";
 
            // reads message from client until "Over" is sent
            while (!line.equals("Over"))
            {
                try
                {
                    line = in.readUTF();
                    System.out.println(line);
 
                }
                catch(IOException i)
                {
                    System.out.println(i);
                }
            }
            System.out.println("Closing connection");
 
            // close connection
            socket.close();
            in.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }
 
    public static void main(String args[])
    {
        Server server = new Server(5000);
    }
}


服务器编程

建立套接字连接

要编写服务器应用程序,需要两个套接字。

  • 等待客户端请求的 ServerSocket(当客户端创建新的 Socket() 时)
  • 用于与客户端通信的普通旧 Socket 套接字。

沟通
getOutputStream() 方法用于通过套接字发送输出。

关闭连接
完成后,通过关闭套接字以及输入/输出流来关闭连接很重要。

Java

// A Java program for a Server
import java.net.*;
import java.io.*;
 
public class Server
{
    //initialize socket and input stream
    private Socket          socket   = null;
    private ServerSocket    server   = null;
    private DataInputStream in       =  null;
 
    // constructor with port
    public Server(int port)
    {
        // starts server and waits for a connection
        try
        {
            server = new ServerSocket(port);
            System.out.println("Server started");
 
            System.out.println("Waiting for a client ...");
 
            socket = server.accept();
            System.out.println("Client accepted");
 
            // takes input from the client socket
            in = new DataInputStream(
                new BufferedInputStream(socket.getInputStream()));
 
            String line = "";
 
            // reads message from client until "Over" is sent
            while (!line.equals("Over"))
            {
                try
                {
                    line = in.readUTF();
                    System.out.println(line);
 
                }
                catch(IOException i)
                {
                    System.out.println(i);
                }
            }
            System.out.println("Closing connection");
 
            // close connection
            socket.close();
            in.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }
 
    public static void main(String args[])
    {
        Server server = new Server(5000);
    }
}

要点

  • 服务器应用程序在特定端口 5000 上创建一个 ServerSocket。这将启动我们的服务器侦听来自端口 5000 的客户端请求。
  • 然后服务器创建一个新的 Socket 与客户端通信。
socket = server.accept()
  • accept() 方法阻塞(只是坐在那里),直到客户端连接到服务器。
  • 然后我们使用 getInputStream() 方法从套接字获取输入。我们的服务器一直在接收消息,直到客户端发送“结束”。
  • 完成后,我们通过关闭套接字和输入流来关闭连接。
  • 要在您的机器上运行客户端和服务器应用程序,请编译它们。然后首先运行服务器应用程序,然后运行客户端应用程序。

在终端或命令提示符上运行

打开两个窗口,一个用于服务器,另一个用于客户端

1.首先运行Server应用程序,

$ java Server

服务器启动
等待客户...

2.然后在另一个终端上运行客户端应用程序,

$ java Client

它将显示 - 已连接并且服务器接受客户端并显示,
客户接受

3. 然后您可以开始在客户端窗口中输入消息。这是客户端的示例输入

Hello
I made my first socket connection
Over

服务器同时接收和显示,

Hello
I made my first socket connection
Over
Closing connection

请注意,发送“Over”会关闭客户端和服务器之间的连接,就像之前所说的那样。

如果您使用的是 Eclipse 或类似的东西-

  1. 在两个不同的终端或选项卡上编译它们
  2. 首先运行服务器程序
  3. 然后运行客户端程序
  4. 在客户端窗口中键入消息,服务器窗口将同时接收和显示这些消息。
  5. 键入结束。