HTTP通信 & HTTP客户端服务器的代码实现

HTTP 协议

Http protocol :Request/Response based,and stateless protocol(基于请求和响应的无状态协议),http 基本TCP/IP,需要对socket通信有一些理解。

HTTP通信的7步

1) 建立TCP/IP连接(Http/ftp 都是TCP/ip的上层协议,必须先建立)

2)Web browser 向Web Server 发送请求命令(例如:Get/sample/hello)

3)Web browser 发送Http Request Header

4)Web Server 应答(connection的状态等等)

5) web Server 发送Response Header

6)Web Server 返回Response Body

7)关闭TCP/IP (不知道下次用户操作的时间)

HTTP Server 代码实现(C#)

常用的web Server我们常用的web服务,是IIS,tomcat等。在进行网络通信的时候我们还会用到socket,甚至可以基于socket来实现HTTP通信,不过我们看一下更简单的实现。

using System;
using System.Net;
using System.Text;
using System.Threading;

namespace httpRequestTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var httpListener = new HttpListener();
            httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
            httpListener.Prefixes.Add("http://localhost/");
            httpListener.Start();

            var httpThread = new Thread(new ThreadStart((() =>
            {
                try
                {
                    loop(httpListener);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    httpListener.Stop();
                }
                
            })));

            httpThread.Start();
        }

        private static void loop(HttpListener httpListenner)
        {
            while (true)
            {
                HttpListenerContext context = httpListenner.GetContext();
                HttpListenerRequest request = context.Request;
                HttpListenerResponse response = context.Response;
                Servlet servlet = new MyServlet();
                servlet.onCreate();
                if (request.HttpMethod == "POST")
                {
                    servlet.onPost(request, response);
                }
                else if (request.HttpMethod == "GET")
                {
                    servlet.onGet(request, response);
                }
                response.Close();
            }
        }
    }

    public class Servlet
    {
        public virtual void onGet(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response) { }
        public virtual void onPost(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response) { }

        public virtual void onCreate()
        {

        }
    }


    public class MyServlet : Servlet
    {
        public override void onCreate()
        {
            base.onCreate();
        }

        public override void onGet(HttpListenerRequest request, HttpListenerResponse response)
        {
            Console.WriteLine("GET:" + request.Url);
            byte[] buffer = Encoding.UTF8.GetBytes("OK");

            System.IO.Stream output = response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
            // You must close the output stream.
            output.Close();
            //listener.Stop();
        }

        public override void onPost(HttpListenerRequest request, HttpListenerResponse response)
        {
            Console.WriteLine("POST:" + request.Url);
            byte[] res = Encoding.UTF8.GetBytes("OK");
            response.OutputStream.Write(res, 0, res.Length);
        }
    }
}

HTTP Client 代码实现(C#)

案例:可以和上面的server 联调,理解完整的HTTP过程

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientDemo
{
    class Program
    {
        // HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
        static readonly HttpClient client = new HttpClient();

        static async Task Main()
        {
            // Call asynchronous network methods in a try/catch block to handle exceptions.
            try
            {
                HttpResponseMessage response = await client.GetAsync("http://localhost/");
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                // Above three lines can be replaced with new helper method below
                // string responseBody = await client.GetStringAsync(uri);

                Console.WriteLine(responseBody);
                Console.ReadKey();
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("\nException Caught!");
                Console.WriteLine("Message :{0} ", e.Message);
            }
        }
    }
}

Node.js Server 实现

通过案例可以看到Node.js对HTTP的封装更好,实现起来最方便

const http = require('http');
const server = http.createServer();
server.on('request',function(req,res){
console.log(req);
console.log(res);
});

server.listen(80,function(){
console.log('running http server');
});

client 可以使用 ajax 实现

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的Java客户端服务器之间进行加密通信代码示例: // 服务器代码 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Server { private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES"; public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(1234); System.out.println("等待客户端连接..."); Socket clientSocket = serverSocket.accept(); System.out.println("客户端已连接."); // 生成随机密钥 KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); // 发送密钥给客户端 OutputStreamWriter keyWriter = new OutputStreamWriter(clientSocket.getOutputStream()); String encodedKey = new BASE64Encoder().encode(secretKey.getEncoded()); keyWriter.write(encodedKey); keyWriter.flush(); // 创建加密和解密对象 Cipher encryptCipher = Cipher.getInstance(TRANSFORMATION); encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey); Cipher decryptCipher = Cipher.getInstance(TRANSFORMATION); decryptCipher.init(Cipher.DECRYPT_MODE, secretKey); // 读取客户端发送过来的数据并解密 BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String data = reader.readLine(); String decryptedData = new String(decryptCipher.doFinal(new BASE64Decoder().decodeBuffer(data))); System.out.println("接收到的数据: " + decryptedData); serverSocket.close(); } } // 客户端代码 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import javax.crypto.Cipher; import javax.crypto.SecretKey; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Client { private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES"; public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 1234); // 从服务器接收密钥 BufferedReader keyReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String encodedKey = keyReader.readLine(); byte[] decodedKey = new BASE64Decoder().decodeBuffer(encodedKey); SecretKey secretKey = new SecretKeySpec(decodedKey, ALGORITHM); // 创建加密和解密对象 Cipher encryptCipher = Cipher.getInstance(TRANSFORMATION); encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey); Cipher decryptCipher = Cipher.getInstance(TRANSFORMATION); decryptCipher.init(Cipher.DECRYPT_MODE, secretKey); // 发送加密数据给服务器 String message = "Hello World!"; String encryptedMessage = new BASE64Encoder().encode(encryptCipher.doFinal(message.getBytes())); OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream()); writer.write(encryptedMessage); writer.flush(); socket.close(); } } 这个示例使用了Java中的AES加密算法,在服务器客户端之间共享一个随机生成的密钥。在通信过程中,数据通过AES算法进行加密和解密。注意,这个示例并不是最安全的实现方法,只是为了演示如何进行加密通信。在实际生产环境中,需要更加安全的实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值