下面是详细讲解“Java网络编程之简单的服务端客户端应用实例”的完整攻略。
简介
网络编程是指在计算机网络环境下,不同计算机之间利用程序进行数据交换。Java提供了一套完善的网络编程库,可以快速实现各种网络应用程序。本篇攻略将针对Java网络编程的服务端和客户端进行详细介绍,并通过示例演示其具体实现方法。
服务端
服务端是指在网络中提供服务的计算机程序,主要负责处理客户端的请求,并返回相应的结果。在Java网络编程中,服务端一般有以下实现步骤:
- 创建ServerSocket对象,指定端口号,监听客户端的请求;
- 调用accept()方法,等待客户端的连接请求;
- 接收到客户端的连接请求后,创建Socket对象,获取输入输出流,并进行通信;
- 服务端响应客户端请求,返回响应结果;
- 通信完成后,关闭输入输出流,关闭Socket连接。
下面是一个服务端示例代码:
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server is ready.");
while(true){
Socket socket = serverSocket.accept();
System.out.println("Client connected.");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
String line = in.readLine();
System.out.println("Client message: " + line);
out.println("Server response: " + line);
out.close();
in.close();
socket.close();
}
}
}
这个例子中,我们创建了一个ServerSocket对象并指定了监听端口号为8888。在while循环中,我们调用accept()方法等待客户端的连接请求。当客户端连接到服务端时,我们获取该连接的输入输出流,进行通信。客户端发送字符串后,服务端返回响应结果。通信完成后,我们关闭输入输出流和Socket连接。
客户端
客户端是指在网络中请求服务的计算机程序,主要负责向服务端发送请求,并接收服务端返回的响应结果。在Java网络编程中,客户端一般有以下实现步骤:
- 创建Socket对象,指定服务端IP地址和端口号,建立连接;
- 获取输入输出流,并进行通信;
- 发送请求到服务端,接收服务端返回的响应结果;
- 通信完成后,关闭输入输出流,关闭Socket连接。
下面是一个客户端示例代码:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost", 8888);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
out.println("Hello Server.");
String line = in.readLine();
System.out.println("Server message: " + line);
out.close();
in.close();
socket.close();
}
}
这个例子中,我们创建了一个Socket对象并指定了服务端的IP地址和端口号。获取该连接的输入输出流进行通信。客户端发送字符串“Hello Server.”后,服务端返回响应结果。通信完成后,我们关闭输入输出流和Socket连接。
示例说明
示例1:简单文件传输
我们在服务端创建一个文件,然后在客户端连接服务端并将该文件发送到服务端。接着服务端将该文件存储到本地磁盘上。文件传输完成后,服务端将上传结果返回给客户端。
服务端代码:
import java.io.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server is ready.");
while(true){
Socket socket = serverSocket.accept();
System.out.println("Client connected.");
InputStream in = socket.getInputStream();
OutputStream out = new FileOutputStream("file.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf)) != -1){
out.write(buf, 0, len);
out.flush();
}
out.close();
in.close();
socket.close();
System.out.println("File uploaded successfully.");
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class FileClient {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost", 8888);
OutputStream out = socket.getOutputStream();
InputStream in = new FileInputStream("file.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf)) != -1){
out.write(buf, 0, len);
out.flush();
}
in.close();
out.close();
socket.close();
System.out.println("File uploaded successfully.");
}
}
示例2:多线程聊天室
我们在服务端创建一个聊天室,客户端可以连接到聊天室并进行在线聊天。服务端可以实时转发客户端的消息到所有在线连接的客户端。客户端可以随时退出聊天室。
服务端代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
static List<ClientThread> clients = new ArrayList<>();
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server is ready.");
while(true){
Socket socket = serverSocket.accept();
System.out.println("Client connected.");
ClientThread client = new ClientThread(socket);
clients.add(client);
client.start();
}
}
static class ClientThread extends Thread{
Socket socket;
BufferedReader in;
PrintWriter out;
public ClientThread(Socket socket){
this.socket = socket;
}
public void run(){
try{
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
while(true){
String line = in.readLine();
System.out.println(line);
for(ClientThread client : clients){
if(client != this){
client.out.println(line);
}
}
if(line.trim().equals("BYE")){
clients.remove(this);
in.close();
out.close();
socket.close();
return;
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatClient {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost", 8888);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
new Thread(new InputThread(in)).start();
Scanner scanner = new Scanner(System.in);
while(true){
String line = scanner.nextLine();
out.println(line);
if(line.trim().equals("BYE")){
break;
}
}
out.close();
in.close();
socket.close();
}
static class InputThread implements Runnable{
BufferedReader in;
public InputThread(BufferedReader in){
this.in = in;
}
public void run(){
try{
while(true){
String line = in.readLine();
System.out.println(line);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
这个例子中,我们创建了一个多线程的聊天室,在服务端创建了一个Thread子类来处理客户端的消息。每当有客户端发送消息时,服务端会将其转发给所有在线连接的客户端。客户端在发送消息后,也可以接收到其他客户端发送的消息。通信完成后,我们关闭输入输出流和Socket连接。
以上就是“Java网络编程之简单的服务端客户端应用实例”的完整攻略,希望可以帮助到大家。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java网络编程之简单的服务端客户端应用实例 - Python技术站