让我来为大家详细讲解“基于Java实现Socket编程入门”的完整攻略。
什么是Socket编程
Socket编程是网络编程的基础,它允许不同设备之间基于网络相互通信。Socket编程使用TCP和UDP协议来传输数据,它们是传输控制协议(TCP)和用户数据报协议(UDP)。在Socket编程中,设备被称为“主机”或“客户机”。
Socket编程的四个基本任务
Socket编程有四个基本任务:
- 创建Socket:在主机上创建一个Socket。
- 绑定Socket:将Socket绑定到一个端口。
- 发送数据:从一个Socket发送一些数据。
- 接收数据:从一个Socket接收一些数据。
Java中的Socket编程
在Java中,Socket编程可以通过java.net包实现。它提供了Socket和ServerSocket类,其中Socket类用于创建客户端Socket对象,而ServerSocket类用于创建服务器端Socket对象。
Socket类提供了一组用于连接和通信的方法,包括connect(), getOutputStream()和getInputStream()等。ServerSocket类用于监听客户端连接,一个服务器应用程序通常创建一个ServerSocket对象来侦听来自客户端的请求,然后创建一个Socket对象以便与客户端通信。
下面是一个简单的Java Socket编程示例,演示了如何创建客户端Socket和ServerSocket对象,以及如何发送和接收数据:
示例1
客户端代码
import java.net.*;
import java.io.*;
public class Client{
public static void main(String[] args) throws IOException {
// 创建一个Socket对象,并连接到服务器端的IP和端口号
Socket socket = new Socket("127.0.0.1", 5555);
// 将信息转换为字节流,并写入socket输出流
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String sendMessage = "测试信息";
bw.write(sendMessage);
bw.flush();
System.out.println("客户端发送信息:" + sendMessage);
// 从socket的输入流读取数据
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
System.out.println("收到服务器回复的信息: " + message);
// 关闭流和Socket
br.close();
isr.close();
is.close();
bw.close();
osw.close();
os.close();
socket.close();
}
}
服务端代码
import java.net.*;
import java.io.*;
public class Server{
public static void main(String[] args) throws IOException {
// 监听来自客户端的请求,并绑定到5555端口上
ServerSocket serverSocket = new ServerSocket(5555);
System.out.println("等待客户端连接...");
// 在接收到客户端的连接请求之前,该调用会阻止服务器的执行
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功...");
// 从socket的输入流读取数据
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
System.out.println("收到来自客户端发送的信息:" + message);
// 将信息转换为字节流,并写入socket输出流
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String sendMessage = "已收到信息:"+ message;
bw.write(sendMessage);
bw.flush();
// 关闭流和Socket
br.close();
isr.close();
is.close();
bw.close();
osw.close();
os.close();
socket.close();
serverSocket.close();
}
}
示例2
客户端代码
import java.net.*;
import java.io.*;
public class Client{
public static void main(String[] args){
try{
// 创建一个Socket对象,并连接到服务器端
Socket socket = new Socket("127.0.0.1", 5555);
// 获取socket的输入流,用于从服务器端读取数据
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
// 获取socket的输出流,用于向服务器端发送数据
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
// 发送数据到服务器端
dos.writeUTF("Hello Server");
// 接收从服务端返回的数据,并输出
String message = dis.readUTF();
System.out.println("Received message from server: " + message);
// 关闭流和Socket
dis.close();
is.close();
dos.close();
os.close();
socket.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
服务端代码
import java.io.*;
import java.net.*;
public class Server{
public static void main(String[] args){
try{
// 创建一个 ServerSocket 对象,准备监听客户端的连接请求
ServerSocket serverSocket = new ServerSocket(5555);
System.out.println("Waiting for client handshake request...");
// 建立与客户端连接
Socket socket = serverSocket.accept();
System.out.println("Connected with client:" + socket.getInetAddress().getHostAddress());
// 获取socket的输入流,用于从客户端读取数据
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
// 获取socket的输出流,用于向客户端发送数据
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
// 从客户端读取数据,并输出
String message = dis.readUTF();
System.out.println("Received message from client: " + message);
// 向客户端发送一条消息
dos.writeUTF("Hello Client");
// 关闭流和Socket
dis.close();
is.close();
dos.close();
os.close();
socket.close();
serverSocket.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
以上两个示例参考了阮一峰老师在其博客中的示例,并做了一定的改动。
希望以上示例对大家初步了解如何基于Java实现Socket编程有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Java实现Socket编程入门 - Python技术站