最近学到了网络编程,有个练习:
模拟B\S服务器 模拟网站服务器,使用浏览器访问自己编写的服务端程序,查看网页效果。
踩了两个坑,就是:
注意事项:
- ①这个是HTTP的响应头是固定的格式,需要注意:
Http响应头要固定:
- ②谷歌看不了,建议换其他浏览器看。
1 2 3 4 5
| os.write("HTTP/1.1 200 OK\r\n".getBytes()); os.write("Content‐Type:text/html\r\n".getBytes()); os.write("\r\n".getBytes());
|
写代码思路
- 客户端是网站,我们只写服务端
- 需要写两个服务端,一个是向客户端发送html代码,一个是发送图片
- 建立连接时,需要使用HTTP协议,而不能使用HTTPS协议,这个协议被加密了,所以客户端只能输出加密的请求头。
- 服务端的执行步骤:
- 先创建ServerSocket,监听请求,接收到了,就使用accept( )捕获。
- 利用网络输入流,读取客户端请求头,然后获取Get请求,其中的文件地址。
- 处理地址格式
- 使用本地文件流,读取文件,并向客户端输出
- 在创建一个传输照片的服务端,与传输html的服务端代码几乎一样,差别在于,传输照片服务端,要一直监听请求,因为他传输的不是一张照片
- 优化:
<font color=red>使用多线程,加快传输效率</font>
下面放出全部代码:
html服务端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import java.io.*; import java.net.ServerSocket; import java.net.Socket;
public class Server { public static void main(String[] args) throws IOException { System.out.println("服务端启动,等待连接。。。。"); ServerSocket server = new ServerSocket(8888); Socket socket = server.accept(); InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = br.readLine(); String[] s1 = s.split(" "); String path = s1[1].substring(1); System.out.println(path);
FileInputStream fis = new FileInputStream(path); OutputStream os = socket.getOutputStream();
os.write("HTTP/1.1 200 OK\r\n".getBytes()); os.write("Content‐Type:text/html\r\n".getBytes()); os.write("\r\n".getBytes());
byte bytes[] = new byte[1024]; int len = 0; while((len = fis.read(bytes))!=-1){ os.write(bytes); } fis.close(); br.close(); socket.close();
} }
|
照片服务端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| import java.io.*; import java.net.ServerSocket; import java.net.Socket;
public class ImageServer { public static void main(String[] args) throws IOException { System.out.println("服务端启动,等待连接。。。。"); ServerSocket server = new ServerSocket(8888); while (true){ Socket socket = server.accept(); InputStream is = socket.getInputStream();
new Thread(new Runnable() { @Override public void run() { try{ BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = br.readLine(); String[] s1 = s.split(" "); String path = s1[1].substring(1); System.out.println(path);
FileInputStream fis = new FileInputStream(path); OutputStream os = socket.getOutputStream();
os.write("HTTP/1.1 200 OK\r\n".getBytes()); os.write("Content‐Type:text/html\r\n".getBytes()); os.write("\r\n".getBytes());
byte bytes[] = new byte[1024]; int len = 0; while((len = fis.read(bytes))!=-1){ os.write(bytes); } fis.close(); br.close(); socket.close(); }catch (IOException e){ e.printStackTrace(); } } }).start();
}
} }
|