Java使用Socket简单通讯详解

yizhihongxing

下面是关于“Java使用Socket简单通讯详解”的完整攻略:

简介

在编写网络应用程序时,经常需要进行网络通信,而Socket就是这个时候经常使用的一种通信方式。本篇文章将分享如何使用Java中的Socket实现简单的通讯。

Socket通信原理

先介绍一下Socket通信的基本原理。在Socket通信中,客户端连接服务器后,双方建立起一个TCP连接,之后双方都可以通过读写流来进行通信。当一方向流中写入数据后,另一方可从流中读取这些数据。这里分别介绍客户端与服务器端的实现。

客户端

首先,客户端需要先创建一个Socket对象来连接服务器。此时,需要知道服务器的地址和端口号。代码如下:

import java.net.Socket;

public class Client {
    public static void main(String[] args) throws Exception {
        String host = "localhost"; // 服务器地址
        int port = 8888; // 服务器端口号
        Socket client = new Socket(host, port);
    }
}

以上代码中,使用localhost作为服务器地址,8888作为端口号。实际使用中,则需要使用具体的服务器地址和端口号进行连接。

连接成功后,客户端即可通过client的输出流向服务器端传输数据,也可以从client的输入流中读取服务器端返回的数据。以下是一个简单的示例,展示了如何向服务器端发送一条消息,以及从服务器端获取返回结果:

import java.net.Socket;

public class Client {
    public static void main(String[] args) throws Exception {
        String host = "localhost"; // 服务器地址
        int port = 8888; // 服务器端口号
        Socket client = new Socket(host, port);
        // 向服务器发送消息
        PrintWriter writer = new PrintWriter(client.getOutputStream());
        writer.println("Hello Server!");
        writer.flush();

        // 读取服务器返回的消息
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String response = reader.readLine();
        System.out.println("Server response: " + response);
    }
}

以上代码中,使用PrintWriter向服务器端输出消息,使用BufferedReader从输入流中读取服务器端返回的消息。

服务器端

服务器端需要先创建一个ServerSocket对象,来监听客户端的连接请求。当有客户端连接时,ServerSocket会返回一个Socket对象,通过该对象可进行连接的读写操作。代码如下:

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        int port = 8888; // 服务器端口号
        ServerSocket server = new ServerSocket(port);
        System.out.println("Server start...");

        // 监听客户端的连接请求
        Socket client = server.accept();
        System.out.println("Client connected...");

        // 读取客户端发送的消息
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String message = reader.readLine();
        System.out.println("Client message: " + message);

        // 向客户端发送消息
        PrintWriter writer = new PrintWriter(client.getOutputStream());
        writer.println("Hello Client!");
        writer.flush();

        client.close();
        server.close();
    }
}

以上代码中,先创建一个ServerSocket对象,并且通过accept()方法来监听客户端的连接请求。当客户端连接成功后,便可从client对应的输入流中读取数据,也可以通过client的输出流向客户端发送数据。

示例一:简单的聊天程序

接下来,我们将以上的客户端与服务器端代码结合起来,编写一个简单的聊天程序。示例一:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
    public static void main(String[] args) throws Exception {
        int port = 8888; // 服务器端口号
        ServerSocket server = new ServerSocket(port);
        System.out.println("Server start...");

        // 监听客户端的连接请求
        Socket client = server.accept();
        System.out.println("Client connected...");

        // 循环进行消息的收发
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintWriter writer = new PrintWriter(client.getOutputStream());
        BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            // 读取客户端发送的消息
            String message = reader.readLine();
            if (message == null) {
                break;
            }
            System.out.println("Client: " + message);

            // 发送消息给客户端
            String response = consoleReader.readLine();
            writer.println(response);
            writer.flush();
        }

        client.close();
        server.close();
    }
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {
    public static void main(String[] args) throws Exception {
        String host = "localhost"; // 服务器地址
        int port = 8888; // 服务器端口号
        Socket client = new Socket(host, port);
        // 循环进行消息的收发
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintWriter writer = new PrintWriter(client.getOutputStream());
        BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            // 发送消息给服务器
            String message = consoleReader.readLine();
            writer.println(message);
            writer.flush();

            // 读取服务器返回的消息
            String response = reader.readLine();
            if (response == null) {
                break;
            }
            System.out.println("Server: " + response);
        }

        client.close();
    }
}

以上是服务器端与客户端的代码,实现了一个简单的聊天程序。在该程序中,服务器与客户端都可以输入消息,两端互相发送消息。如果想要结束对话,只需要在其中一个输入end即可。

示例二:创建一个文件传输服务器

接下来是第二个示例。该示例是一个文件传输服务器,客户端将本地文件传输到服务器端,并且服务器端会将相同的文件保存到本地文件系统中。以下是服务器端代码:

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileServer {
    private static final int PORT = 7777;

    public static void main(String[] args) throws Exception {
        // 创建ServerSocket对象
        ServerSocket server = new ServerSocket(PORT);
        System.out.println("Server start...");

        while (true) {
            // 监听客户端连接
            Socket socket = server.accept();
            System.out.println("Client[" + socket.getInetAddress().getHostName() + "] connected...");

            // 读取客户端传输的文件
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = socket.getInputStream().read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, len);
            }

            // 保存文件
            String dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
            String fileName = dateStr.replace(" ", "").replace(":", "") + ".txt";
            FileOutputStream fileOutputStream = new FileOutputStream(fileName);
            byteArrayOutputStream.writeTo(fileOutputStream);

            // 关闭流和socket
            fileOutputStream.close();
            byteArrayOutputStream.close();
            socket.close();
        }
    }
}

以上代码中,首先创建一个ServerSocket对象,并通过其accept()方法进行客户端连接的监听。当客户端连接成功后,便可从socket的输入流中读取传输的数据。读取完成后,则根据当前时间生成一个文件名,将数据写入到对应文件中。注意关闭所有的流与socket。

以下是客户端代码,用于将本地文件传输到服务器端。

import java.io.FileInputStream;
import java.net.Socket;

public class FileClient {
    private static final int PORT = 7777;
    private static final String HOST = "localhost";

    public static void main(String[] args) throws Exception {
        // 创建Socket对象
        Socket socket = new Socket(HOST, PORT);

        // 读取文件
        FileInputStream fileInputStream = new FileInputStream("test.txt");
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fileInputStream.read(buffer)) != -1) {
            socket.getOutputStream().write(buffer, 0, len);
        }

        // 关闭流和socket
        fileInputStream.close();
        socket.close();
    }
}

以上代码中,创建一个Socket对象,并将本地文件读入到字节数组中,再通过socket的输出流将字节数组传输到服务器端。需要注意的是,在实际测试中,需要将FileClient与FileServer代码分别运行在两台不同的设备中。

至此,共有两个示例展示了Java中的Socket通信。第一个示例是一个简单的聊天程序,可以通过该程序来体验基本的双向通信。第二个示例则是一个文件传输服务器,展示了如何通过Socket传输文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java使用Socket简单通讯详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • ida小技巧之——f5不能出现伪代码

    以下是关于“IDA小技巧之——F5不能出现伪代码”的完整攻略: F5键 在IDA中,F5键是用于将反汇编代码转换为伪代码的快捷键。但是,在某些情况下,F5键可能无法正常工作,无法将反汇编代码转换为伪代码。 解决方法 以下是一些解决方法,可以尝试解决F5键无法出现伪代码的问题: 检查IDA版本:确保使用的是最新版本的IDA,因为旧版本可能存在一些问题。 检查反…

    other 2023年5月9日
    00
  • c语言中字符串与字符串数组详解

    C语言中字符串与字符串数组详解 什么是字符串? 在C语言中,字符串是以null字符(’\0’)结尾的字符数组。由于字符串实际上是以字符数组的形式存储的,因此我们可以使用字符数组的方式来处理字符串。 字符串的定义方法: char str[] = "Hello World"; 其中,char表示字符类型,str[]表示一个字符数组,”Hell…

    other 2023年6月20日
    00
  • Python实现PyPDF2处理PDF文件的方法示例

    下面我就为你详细讲解“Python实现PyPDF2处理PDF文件的方法示例”的完整攻略,其中包含两条示例说明。 1. 引言 在日常工作中,有时需要对 PDF 文件进行处理来满足业务需求,而 PyPDF2 是 Python 中一个使用简单出色的第三方库,能够完美完成这项任务。 本文将从以下三方面详细讲解 Python 如何使用 PyPDF2 处理 PDF 文件…

    other 2023年6月27日
    00
  • jQueryUI如何自定义组件实现代码

    自定义组件是指利用jQueryUI框架提供的各项API,将普通的HTML元素转化为具有特定功能的组件,如对话框、选项卡、日期选择器等。下面介绍如何利用jQueryUI自定义组件实现代码。 步骤1:引入jQueryUI库 首先,在需要使用自定义组件的页面上引入jQuery和jQueryUI的库文件,可以选择从官网下载,也可以使用CDN方式引入,具体文件和链接如…

    other 2023年6月25日
    00
  • layer弹窗插件操作方法详解

    layer弹窗插件操作方法详解 layer是一款基于jQuery的弹窗插件,可以用于实现各种弹窗效果,例如提示框、确认框、加载框等。本攻略将介绍layer的基本用法和示例。 引入layer 在使用layer之前,需要先引入和layer的相关文件。可以通过以下方式引入: <!– 引入jQuery –> <script src="…

    other 2023年5月9日
    00
  • CMD命令名详细大全

    《CMD命令名详细大全》是一篇包含大量Windows命令的文章,主要介绍了常见命令、文件管理、网络设置、系统配置等方面的命令。下面我会结合两个命令,对如何运用这篇文章进行详细讲解。 1.查找命令语法 可以在该文档中找到我们要执行的命令的语法,以及命令的具体用法和描述。首先我们找到文档中介绍cmd常见命令的部分,可以通过浏览器的搜索功能或者直接通过目录查找的方…

    other 2023年6月26日
    00
  • 孤岛惊魂5出现granite2000000怎么办 出现granite2000000错误代码解决办法

    当玩家在玩“孤岛惊魂5”这个游戏时,可能会遇到granite2000000错误代码的问题,导致游戏无法正常进行。下面是解决这个问题的完整攻略: 1. 什么是granite2000000错误代码 Granite2000000是“孤岛惊魂5”游戏中常见的错误代码之一。它通常在尝试进入游戏而由于某些原因无法启动时出现。Granite2000000的意思是 “无法访…

    other 2023年6月27日
    00
  • python的n个小功能(高斯模糊原理及实践)

    python的n个小功能(高斯模糊原理及实践) 在图像处理中,高斯模糊是一种常用的平滑滤波器。它可以减少噪声、消除细节,并使边缘保持连续。在本文中,我们将探讨高斯模糊的原理,并使用Python的OpenCV库实现高斯模糊。 高斯模糊原理 高斯模糊是一种线性滤波器,根据二维高斯函数生成权重矩阵,将该权重矩阵应用于图像上的每个像素,从而生成模糊的图像。二维高斯函…

    2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部