Socket通信学习笔记(一)不同语言间socket通信连接

Socket通信学习笔记(一)不同语言间socket通信连接

实现不同语言作为服务端客户端,实时返回服务端结果。 C#为服务端,python为客户端

文章目录

  • Socket通信学习笔记(一)不同语言间socket通信连接
  • 前言
  • 一、服务端(C#)
  • 二、客户端(python)
  • 三、使用
  • 总结


前言

要求在c#端调用python程序实时得到结果,返回给C#端进行处理。使用Socket通信在本机连接两个程序,服务端由C#实现,客户端由python实现。为了更好的使用,将服务端和客户端封装为类,对外提供使用接口。

一、服务端(C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;
namespace ServerManySelf
{
    class Server
    {
        private TcpListener listener;//监听
        private NetworkStream streamToClient;//流对象
        private TcpClient remoteClient;
        private int BufferSize = 1024;//缓存大小,结果返回只需要个位数,改大会多条信息合并为一条接收
        /// 
        /// 构造函数
        /// 创建服务端连接实例
        /// 
        public Server()
        {
            Console.WriteLine("Server is running ...");
            IPAddress ip = IPAddress.Parse("127.0.0.1");//获取ip地址
            listener = new TcpListener(ip, 8500);
            listener.Start();//开始监听
            Console.WriteLine("Start Listening...");
            //获取一个连接,中断方法
            remoteClient = listener.AcceptTcpClient();
            //打印连接到的客户端信息
            Console.WriteLine("Client Connected! {0}<--{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
            //获取流,并写入buffer中
            streamToClient = remoteClient.GetStream();
        }
        /// 
        /// 获取客户端传入消息
        /// 
        /// 
        public string GetMessage()
        {

            byte[] buffer = new byte[BufferSize];
            int bytesRead = streamToClient.Read(buffer, 0, BufferSize);//一直等待客户端传信息
            Console.WriteLine("Reading data,{0} bytes...", bytesRead);

            //获得请求的字符串
            string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            //string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
            return msg;
        }
        /// 
        /// 关闭服务端连接
        /// 
        public void close()
        {
            listener.Stop();
        }
    }
}

二、客户端(python)

from socket import *

class Client:
    tcpCliSock = 0
    def __init__(self):
        HOST = '127.0.0.1'  # or 'localhost'
        PORT = 8500
        BUFSIZ = 1
        ADDR = (HOST, PORT)
        self.tcpCliSock = socket(AF_INET, SOCK_STREAM)
        self.tcpCliSock.connect(ADDR)

    def _send(self, data1):
        self.tcpCliSock.send(data1.encode('utf-8'))

    def _close(self):
        self.tcpCliSock.close()

三、使用

c#端为服务端,python端为客户端

通过127.0.0.1和端口8500连接

c#关于socket的操作都封装为Server类,提供初始化构建服务端,获取客户端传入信息和关闭服务端函数。

using ServerManySelf;	//引入Server类的命名空间
Server s = new Server();//创建服务端
//循环保证服务端一直监听客户端信息
string msg = s.GetMessage();//获取客户端传入信息
s.close();	//关闭服务端

python关于socket的操作都封装为Client类,提供初始化,发送信息,关闭客户端函数

from Client import *	#引入Client类
client = Client()	# 初始化构造一个客户端
client._send(msg) 	#发送信息,msg必须为string类型
client._close()	#关闭客户端

先运行C#的program开启服务端,再运行python的test01开启客户端发送信息。

总结

当客户端快速发送多条语句时,send函数不会每次都发给服务端,而是会多条语句合并为一句一并发送,语句长度与服务端缓存大小有关。
demo在仓库,欢迎指正错误,如果对你有帮助欢迎star和fork。
也可以在这里下载。

你可能感兴趣的:(网络学习,学习,c#,python,微服务架构,socket)