Java Socket编程系列(一)开发一次性会话的Server和Client

本文介绍Java中的Socket编程,包括客户端和服务端的实现方法,并通过具体示例代码展示了如何建立连接、进行数据收发及关闭连接的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于什么是Socket:


A socket is one end-point of a two-way communication link between two programs running on the network.

Socket是网络上运行的2个程序之间通信链接的终点。说白了就是代表一条通信链路的两端。


Socket classes are used to represent the connection between a client program and a server program.

Socket类用来代表客户端程序和服务器端程序的连接。


The java.net package provides two classes--Socket and ServerSocket--that implement the client side of the connection and the server side of the connection, respectively

Java中的java.net包提供了Socket和ServerSocket类分别实现连接的客户端和服务端。


Java中如何编写?


服务器端:

package com.dylan.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器
 *
 * @author xusucheng
 * @create 2017-12-21
 **/
public class Server {
    public static final int PORT = 8858;//监听的端口号

    public static void main(String[] args) throws Exception {
        System.out.println("Server started! Listening...");
        ServerSocket serverSocket = new ServerSocket(PORT);
        Socket server = serverSocket.accept();

        BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
        PrintWriter out = new PrintWriter(server.getOutputStream());

        String readLine = in.readLine();
        if (readLine != null) {
            System.out.println("Receive message from Client: " + readLine);
            out.println("Roger!");
        }

        out.close();
        in.close();
        server.close();
        serverSocket.close();


    }


}


客户端:

package com.dylan.socket;

import java.io.*;
import java.net.Socket;

/**
 * 客户端
 *
 * @author xusucheng
 * @create 2017-12-20
 **/
public class Client {
    public static final String HOST = "127.0.0.1";//服务器地址
    public static final int PORT = 8858;//服务器端口号

    public static void main(String[] args) throws Exception{
        Socket client = new Socket(HOST,PORT);
        //创建输入流
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //创建输出流
        PrintWriter out = new PrintWriter(client.getOutputStream(),true);
        //向服务器程序发送信息
        out.println("Hello Server! This is Client! ");
        //接收来自服务器程序的响应
        String readLine=in.readLine();
        if(readLine!=null){
            System.out.println("Receive message from Server: "+readLine);
        }

        //关闭链接
        out.close();
        in.close();
        client.close();
    }
}

启动

服务器端

Server started! Listening...

Receive message from Client: Hello Server! This is Client!

客户端:

Receive message from Server: Roger!









Java Socket 编程种基于网络的通信方式,它允许两台计算机之间通过互联网协议(TCP/IP 或 UDP)进行数据交换。以下是关于 Java Socket 知识体系的一个完整介绍: --- ### 1. **基本概念** - **Socket**: 套接字是一个抽象的概念,表示应用程序与网络之间的接口。在 Java 中,`Socket` 类用于实现客户到服务器的连接。 - **ServerSocket**: 表示服务器的套接字,负责监听传入的客户连接请求,并生成相应的 `Socket` 实例供进步通信使用。 --- ### 2. **核心类接口** #### a) **TCP 协议下的关键组件** | 名称 | 描述 | |----------------|----------------------------------------------------------------------| | `Socket` | 提供客户操作的基本 API,包括建立连接、收发数据等功能 | | `ServerSocket`| 提供服务监听的功能 | #### b) **UDP 协议下的关键组件** | 名称 | 描述 | |------------------|---------------------------------------------------------------------| | `DatagramSocket`| 支持无连接的用户数据报文传输 | | `DatagramPacket`| 包含了发送或接收的数据以及目标地址 | --- ### 3. **工作流程** #### (1) TCP 模型 - **服务器**: - 创建 `ServerSocket` 并绑定到特定口上; - 使用循环不断调用其 `accept()` 方法来等待客户连接; - **客户**: - 构造一个新的 `Socket` 对象指向远程机器的目标地址口号即可发起次新的会话过程; #### (2) UDP 模型 不像 TCP 那样正式地确立“连接”,而是直接打包并通过网络投递出去。两都需要明确写出对方的位置信息以便正确组装包头字段内容。 --- ### 4. **典型应用场景** - 文件上传下载服务; - 聊天室系统构建基础模块; - 分布式计算任务调度平台等等... --- 下面给出段简单的代码演示如何利用这两个库创建最简形式的服务客户程序: ```java // Serverside Code Example with ServerSocket and Sockets. import java.io.*; import java.net.*; class SimpleServer{ public static void main(String []args)throws Exception{ int port=8080; ServerSocket ss=new ServerSocket(port); System.out.println("Waiting for connection..."); Socket s=ss.accept();//blocking call DataInputStream dis =new DataInputStream(s.getInputStream()); String str=(String)dis.readUTF(); System.out.println("Message received:"+str); ss.close(); } } // Clientside Corresponding Part using plain old sockets only... import java.io.* ; import java .net .* ; class BasicClient { public static void main( String args [])throws Exception{ Socket skt=new Socket ("localhost",8080 ); PrintStream ps =new PrintStream(skt.getOutputStream ()); ps.print("Hello World!"); skt.close (); } } ``` 以上只是入门级别例子而已实际上还有许多高级特性尚未涉及比如非阻塞I/O模型(NIO),超时控制等都属于更深入范畴值得去研究学习掌握更多技巧提升效率稳定性等方面的表现效果! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值