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

本文档介绍了一种使用C#作为服务端、Python作为客户端的Socket通信实现方式。C#服务端监听8500端口,Python客户端通过此端口发送数据。服务端使用TcpListener和TcpClient类进行监听和接收,客户端则使用Python的socket库发送和接收数据。文章提供了详细代码示例,并指出当客户端快速发送多条信息时,可能会合并为一条发送,这与服务端缓存大小有关。
摘要由CSDN通过智能技术生成

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;//缓存大小,结果返回只需要个位数,改大会多条信息合并为一条接收
        /// <summary>
        /// 构造函数
        /// 创建服务端连接实例
        /// </summary>
        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();
        }
        /// <summary>
        /// 获取客户端传入消息
        /// </summary>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// 关闭服务端连接
        /// </summary>
        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。
也可以在这里下载

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiaoooooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值