一个简单的Java服务器

/**
 * 
 */
package iotest.serversocket;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Brandon B. Lin
 * 
 */
public class SingleFileHttpServer extends Thread {

	private byte[] content;
	private byte[] header;
	private int port = 80;

	public SingleFileHttpServer(String data, String encoding, String MIMEType,
			int port) throws UnsupportedEncodingException {
		this(data.getBytes(encoding), encoding, MIMEType, port);
	}

	public SingleFileHttpServer(byte[] data, String encoding, String MIMEType,
			int port) throws UnsupportedEncodingException {
		this.content = data;
		this.port = port;
		createHeader(encoding, MIMEType);
	}

	private void createHeader(String encoding, String MIMEType)
			throws UnsupportedEncodingException {
		String header = "HTTP/1.0 200 OK\r\n" + "Server: OneFIle 1.0\r\n"
				+ "Content-length: " + content.length + "\r\n"
				+ "Content-type: " + MIMEType + "\r\n\r\n";
		this.header = header.getBytes(encoding);

	}

	@Override
	public void run() {
		try {
			ServerSocket server = new ServerSocket(port);
			log(server.getLocalPort());
			while (true) {
				respond(server);
			}
		} catch (IOException exception) {
			System.err.println("Could not start server. Port Occupied!");
		}
	}

	private void log(int port) {
		System.out.println("Accepting connection on port " + port);
		System.out.println("Data to be sent: ");
		try {
			System.out.write(content);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void respond(ServerSocket server) {
		Socket connection = null;
		try {
			connection = server.accept();
			String request = readRequestFromSocket(connection);
			boolean writeHeader = (request.toString().indexOf("HTTP/") != -1);
			writeToSocket(connection, writeHeader);

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (connection != null)
				try {
					connection.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

	}

	private String readRequestFromSocket(Socket connection) throws IOException {
		InputStream in = new BufferedInputStream(connection.getInputStream());
		StringBuffer request = new StringBuffer(80);
		while (true) {
			int readByte = in.read();
			if (readByte == '\r' || readByte == '\n' || readByte == -1)
				break;
			request.append((char) readByte);
		}
		return request.toString();
	}

	private void writeToSocket(Socket connection, boolean writeHeader)
			throws IOException {
		OutputStream out = new BufferedOutputStream(
				connection.getOutputStream());
		if (writeHeader) {
			out.write(header);
		}
		out.write(content);
		out.flush();
	}

	public static void main(String[] args) {
		String fileName = "index.html";
		String contentType = "text/html";
		String encoding = "ASCII";
		int port = 80;

		byte[] data = readFileToByteArray(fileName);

		try {
			new SingleFileHttpServer(data, encoding, contentType, port).start();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

	}

	private static byte[] readFileToByteArray(String fileName) {

		byte[] data = null;
		try {
			InputStream in = new FileInputStream(fileName);
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			int readByte;
			while ((readByte = in.read()) != -1)
				out.write(readByte);
			data = out.toByteArray();
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return data;

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,在 Java 中构建一个服务器需要使用到 java.net 包中的类。下面是一个简单服务器例子: ``` import java.net.*; import java.io.*; public class SimpleServer { public static void main(String[] args) throws IOException { // 监听端口 8888 ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); // 等待客户端连接 Socket clientSocket = serverSocket.accept(); System.out.println("客户端已连接: " + clientSocket.getRemoteSocketAddress()); // 从客户端读取数据 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("收到客户端数据: " + inputLine); } // 关闭流和套接字 in.close(); clientSocket.close(); serverSocket.close(); } } ``` 该服务器程序会监听端口 8888,当客户端连接后,服务器会读取客户端发送的数据并打印到控制台。 注意:这只是一个简单服务器例子,实际上服务器程序可能需要处理多个客户端连接,进行数据的发送和接收,以及处理各种异常情况等。 ### 回答2: 用Java编写一个服务器可以通过JavaSocket类和ServerSocket类来实现。以下是一个简单的示例: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { // 创建服务器Socket,监听指定端口 ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { // 等待客户端连接 Socket socket = serverSocket.accept(); System.out.println("客户端已连接:" + socket.getInetAddress().getHostAddress()); // 获取输入流和输出流 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); // 读取客户端发送的数据 byte[] buffer = new byte[1024]; int length = inputStream.read(buffer); String requestData = new String(buffer, 0, length, "UTF-8"); System.out.println("收到客户端的请求:" + requestData); // 处理请求并返回响应 String responseData = "Hello, Client!"; outputStream.write(responseData.getBytes("UTF-8")); // 关闭流和Socket连接 outputStream.close(); inputStream.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 这个服务器会在8888端口上监听客户端连接。当客户端连接成功后,服务器会读取客户端发送的数据,然后处理请求并返回响应。在这个示例中,服务器收到客户端的请求后简单地返回"Hello, Client!"作为响应。 以上是一个简单的示例,实际开发中可能需要根据具体需求进行更复杂的处理。 ### 回答3: 编写一个基于Java服务器可以使用Java的标准库中的ServerSocket类来实现。具体步骤如下: 1. 创建一个ServerSocket对象,指定服务器监听的端口号。 2. 使用ServerSocket的accept()方法监听客户端的连接请求。该方法会阻塞程序执行,直到有客户端连接成功后才会返回一个Socket对象。 3. 获取到Socket对象后,可以通过其提供的输入输出流与客户端进行通信。可以使用InputStream来接收客户端发送的数据,使用OutputStream来发送数据给客户端。 4. 根据需求,可以使用多线程的方式来处理多个客户端的并发请求。每当有一个客户端连接成功,就创建一个新的线程来处理客户端的请求。 5. 在处理客户端请求的线程中,可以根据具体需求进行相应的业务逻辑处理。 6. 当客户端请求处理完后,可以通过调用Socket对象的close()方法关闭与该客户端的连接。 7. 服务器可以通过循环等待新的客户端连接,以便持续地为客户端提供服务。 需要注意的是,编写一个完整的服务器需要根据具体的需求进行功能的补充,例如处理不同的请求、实现用户认证等。此外,还需要考虑服务器的性能优化、异常处理、日志记录等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值