【JAVA】使用Socket完成客户端与服务端的双向通信

                      使用Socket完成客户端与服务端的双向通信

有些公司面试中常常要求白板编程,其中Socket编程是个出现频率比较高的题目。在此记录一下自己学习Socket编程的心得,做一个简单的双向通信的例子。


要求

客户端发送数据,服务端回显相同的数据。


服务端:

package day1106;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Socket之服务端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("我是服务端");
        //监听端口
        int port = 43438;
        ServerSocket serverSocket = new ServerSocket(port);
        //建立连接
        Socket socket = serverSocket.accept();

        //获得客户端传来的数据
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, len, "utf-8"));
            System.out.println("服务端正在从输入流中读数据");
        }
        System.out.println("服务端收到了:" + sb.toString());


        //接收到数据后,回显收到的数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(sb.toString().getBytes("utf-8"));

        inputStream.close();
        outputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

package day1106;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * Socket之客户端
 */
public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("我是客户端");
        //指定目标主机ip与端口
        String host = "127.0.0.1";
        int port = 43438;
        Socket socket = new Socket(host, port);

        //想服务端发送数据
        OutputStream outputStream = socket.getOutputStream();
        //接收用户输入
        Scanner sc = new Scanner(System.in);
        String message = sc.nextLine();
        outputStream.write(message.getBytes("utf-8"));
        outputStream.flush();
        //终止发送数据,客户端现在只接收数据
        //如果不加shutdownOutput,服务器端一直阻塞在read()方法中,导致客户端无法收到服务端回显的数据
        //shutdownOutput只关闭客户端向服务端的输出流,并不会关闭整个Socket的连接
        socket.shutdownOutput();

        //从服务端接收数据
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, len, "utf-8"));
            System.out.println("客户端正在从输入流中读数据");
        }
        System.out.println("来自服务端的回显:" + sb.toString());

        //调用close方法,会直接关闭整个Socket连接
        outputStream.close();
        inputStream.close();
        socket.close();
    }
}

发送之前的截图

客户端:

服务端:


发送之后的截图:

客户端:

服务端:

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结: 27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务