下面是关于“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技术站