Java Socket 编程详解

Java Socket 编程是指使用 Java 语言进行网络通信的过程,包括建立连接、传输数据和关闭连接等操作。Java 提供了 java.net.Socket 和 java.net.ServerSocket 两个类来支持 Socket 编程。

一、Socket 基础知识

1.1 Socket 概述

Socket 指的是“插座”,是应用层与传输层之间的桥梁,用于在网络上进行双向通信。在 Socket 编程中,客户端与服务器之间的通信需要通过 Socket 进行实现。客户端通过 Socket 向服务器发送请求,服务器接收请求后返回响应,完成整个通信过程。

1.2 Socket 通信模型

Socket 通信模型分为两种:TCP 和 UDP。TCP 是一种可靠的传输协议,它保证了数据的完整性和有序性,适用于需要可靠传输的场景;UDP 是一种无连接的传输协议,它不保证数据的完整性和有序性,适用于实时通信、流媒体传输等场景。

1.3 Socket 编程流程

Socket 编程流程一般包括以下几个步骤:

  1. 创建 Socket 对象(客户端)或 ServerSocket 对象(服务器)。
  2. 绑定 Socket 地址。
  3. 启动监听进程(服务器)或连接进程(客户端)。
  4. 发送或接收数据。
  5. 关闭连接。

二、Java Socket 编程实现

2.1 创建 Socket 对象

客户端需要创建 Socket 对象连接服务器,而服务器则需要创建 ServerSocket 对象等待客户端连接。创建 Socket 和 ServerSocket 的方法如下所示:

// 创建 Socket
Socket socket = new Socket(String host, int port);

// 创建 ServerSocket
ServerSocket serverSocket = new ServerSocket(int port);

其中,host 表示服务器地址,port 表示端口号。

2.2 绑定 Socket 地址

在建立连接之前,需要将 Socket 绑定到一个本地地址和端口上,以便进行数据传输。绑定 Socket 地址的方法如下所示:

// 绑定 Socket 地址
socket.bind(SocketAddress bindpoint);

其中,bindpoint 为要绑定的地址和端口。

2.3 启动监听进程或连接进程

在创建 ServerSocket 对象后,需要调用 accept() 方法开始等待客户端的连接请求。而在创建 Socket 对象后,需要调用 connect() 方法连接服务器。连接过程如下所示:

// 服务器等待连接
Socket socket = serverSocket.accept();

// 客户端连接服务器
socket.connect(SocketAddress endpoint);

其中,endpoint 为服务器地址和端口。

2.4 发送或接收数据

在连接建立之后,客户端可以使用 Socket 中的 OutputStream 将数据发送给服务器,服务器端则可以使用 Socket 中的 InputStream 接收客户端发送的数据。而客户端可以使用 Socket 中的 InputStream 接收服务器发送的数据,服务器端则可以使用 Socket 中的 OutputStream 将数据发送给客户端。发送和接收数据的方法如下所示:

// 客户端向服务器发送数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write(byte[] b);

// 服务器向客户端发送数据
InputStream inputStream = socket.getInputStream();
inputStream.read(byte[] b);

其中,byte[] b 表示要发送或接收的数据。

2.5 关闭连接

在通信结束后,需要关闭连接以释放资源。关闭连接的方法如下所示:

socket.close();
serverSocket.close();

三、Java Socket 编程注意事项

3.1 端口号问题

在 Socket 编程中,使用的端口号必须是一个非系统保留端口,否则会导致端口被占用的错误。

3.2 处理异常情况

在 Socket 编程中,网络通信可能会出现各种异常情况,如连接超时、连接中断等。因此,在编写 Socket 程序时应该针对可能出现的异常情况进行处理。

3.3 网络负载

在进行 Socket 编程时,应该考虑网络负载的问题,如果网络负载过高,可能会导致连接失败或数据传输失败。

四、总结

Java Socket 编程是一种基于网络通信的编程方式,可以实现客户端与服务器之间的双向通信。在 Socket 编程中,需要使用 Socket 和 ServerSocket 两个类来实现网络通信,同时还需要考虑网络负载和异常情况等问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ArrayList Threader = new ArrayList(); private static LinkedList Message_Array = new LinkedList(); private static int Thread_Counter = 0; private static boolean isClear = true; protected static final int SERVER_PORT = 10000; protected FileOutputStream LOG_FILE = new FileOutputStream( "d:/connect.log", true); public Server() throws FileNotFoundException, IOException { super(SERVER_PORT); // append connection log // Calendar now = Calendar.getInstance(); // String str = "[" + now.getTime().toString() + // "] Accepted a connection"; // byte[] tmp = str.getBytes(); // LOG_FILE.write(tmp); try { Socket socket = accept(); while (true) { new ServerReaderThread(socket); new ServerWriterThread(socket); } } finally { close(); } } public static void main(String[] args) throws IOException { new Server(); } // --- CreateServerThread class ServerReaderThread extends Thread { private Socket client; private BufferedReader in; private PrintWriter out; private String Username; public ServerReaderThread(Socket s) throws IOException { client = s; in = new BufferedReader(new InputStreamReader(client .getInputStream())); out = new PrintWriter(client.getOutputStream(), true); start(); } public void run() { try { int flag = 0; Thread_Counter++; String line = in.readLine(); while (!line.equals("bye")) { out.println(line); line = in.readLine(); } out.println("--- See you, bye! ---"); // System.out.println("--- See you, bye! ---"); client.close(); } catch (IOException e) { } finally { try { client.close(); } catch (IOException e) { } Thread_Counter--; } } } // --- CreateServerThread class ServerWriterThread extends Thread { priva

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家都说我身材好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值