视频教程:“老生常谈Java 网络编程 —— Socket 详解”攻略
欢迎学习本教程,本教程将为您详细阐述Java中网络编程的Socket模块的使用方法及相关细节。以下是您需要学习的知识点:
什么是Socket?
Socket,或称“套接字”,是应用层与传输层之间的一个中间层。Socket层为应用程序提供了一组可以在网络上进行通信的API,包括以下内容:
- IP地址;
- 传输协议(TCP/UDP);
- 端口号。
在Java中,Socket由java.net包提供。
如何使用Socket?
在Java中,使用Socket建立起网络连接,读取和发送数据的过程可以如下图所示:
/**
* 客户端代码示例
*/
public class Client {
public static void main(String[] args) throws Exception {
Socket client = new Socket("localhost", 9000);
// 发送请求数据流
OutputStream output = client.getOutputStream();
String requestData = "Hello, Server";
output.write(requestData.getBytes("UTF-8"));
// 接收响应数据流
InputStream inputStream = client.getInputStream();
byte[] responseByte = new byte[1024];
int length = inputStream.read(responseByte);
String responseData = new String(responseByte, 0, length, "UTF-8");
// 关闭流和Socket
inputStream.close();
output.close();
client.close();
}
}
/**
* 服务器端代码示例
*/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9000);
while (true) {
Socket client = server.accept();
// 接收请求数据流
InputStream inputStream = client.getInputStream();
byte[] requestByte = new byte[1024];
int length = inputStream.read(requestByte);
String requestText = new String(requestByte, 0, length, "UTF-8");
System.out.println("Server request:" + requestText);
// 响应请求数据流
OutputStream output = client.getOutputStream();
String responseText = "Hello, Client";
output.write(responseText.getBytes("UTF-8"));
// 关闭流和Socket
inputStream.close();
output.close();
client.close();
}
}
}
代码分为服务器端和客户端两部分。首先是服务端的代码,它在循环中持续接受客户端的请求,并返回响应数据。客户端程序在建立Socket连接后向服务器发送数据,并等待服务器的响应。
如何防止Socket的数据损坏?
- 尽量在Socket通信中使用TCP协议;
- 发送数据时需要进行流量控制,避免发送数据过快;
- 接收数据时使用缓存,避免数据接收过快和数据的丢失。
其中,TCP协议的好处是可以保证数据的完整性和可靠性,实现方案可以使用数据校验的方式。
示例
示例1:基于Socket的客户端文件传输
客户端使用Socket向服务端传送文件,服务端将文件转发至指定客户端。代码如下:
/**
* 客户端代码
*/
public class Client {
public static void main(String[] args) throws Exception {
Socket client = new Socket("localhost", 9000);
OutputStream output = client.getOutputStream();
String filePath = "/Users/Test/Desktop/demo.txt";
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
byte[] fileByte = new byte[1024];
int length;
while ((length = fis.read(fileByte)) > 0) {
output.write(fileByte, 0, length);
output.flush();
}
fis.close();
output.close();
client.close();
}
}
/**
* 服务端代码
*/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9000);
while (true) {
Socket client = server.accept();
InputStream inputStream = client.getInputStream();
byte[] fileByte = new byte[1024];
int length;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((length = inputStream.read(fileByte)) > 0) {
baos.write(fileByte, 0, length);
baos.flush();
}
baos.close();
inputStream.close();
FileOutputStream fos = new FileOutputStream("fileOut.txt");
fos.write(baos.toByteArray());
fos.flush();
fos.close();
client.close();
}
}
}
示例2:基于Socket的简易聊天程序
服务端运行于某计算机的端口上,客户端使用Telnet程序连接。所有传输数据都采用文本形式。
/**
* 服务端代码
*/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9000);
while (true) {
Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
if ("bye".equals(inputLine)) {
break;
}
}
in.close();
out.close();
client.close();
}
}
}
/**
* 客户端代码
*/
public class Client {
public static void main(String[] args) throws Exception {
Socket client = new Socket("localhost", 9000);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
if ("bye".equals(inputLine)) {
break;
}
}
in.close();
out.close();
client.close();
}
}
总结
本节课程对Java中Socket模块的使用做了简单介绍,讲解了Socket的概念、如何使用Socket、如何防止Socket的数据损坏,以及两个相关示例。希望通过此教程,您可以更好地理解Java网络编程中Socket模块相关的知识点,掌握Socket编程的基本技能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:老生常谈Java 网络编程 —— Socket 详解 - Python技术站