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。
也可以在这里下载。