C,C++,C#,java,python编写简单的echo服务程序

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

echo网络服务做为初步网络编程的基础。

下面的echo服务,部分是以前写的,部分今天写的,做复习及以后备查之用。

监听本地的8880端口。均以telnet为客户端做的测试(telnet 127.0.0.1 8880)。

检查到换行时,就把一行数据返回给客户端。


C版:

#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	//初始化
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(sockVersion, &wsaData) != 0){
		printf("init error");
		return 0;
	}
	//创建socket
	SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (slisten == INVALID_SOCKET){
		printf("socket error");
		WSACleanup();
		return 0;
	}

	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(8880);
	sin.sin_addr.S_un.S_addr = INADDR_ANY;
	//绑定IP和端口
	if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){
		printf("bind error");
		WSACleanup();
		return 0;
	}
	//监听端口
	if (listen(slisten,5)==SOCKET_ERROR)
	{
		printf("listen error!");
		WSACleanup();
		return 0;
	}

	SOCKET sClient;
	sockaddr_in remoteAddr;
	int nAddrlen = sizeof(remoteAddr);
	char revData[128];
	printf("wait for client connection...\r\n");
	//等待连接
	sClient = accept(slisten, (SOCKADDR*)&remoteAddr, &nAddrlen);
	if (sClient == INVALID_SOCKET){
		printf("accept error!");
		WSACleanup();
		return 0;
	}
	printf("accept client: %s:%d\r\n", inet_ntoa(remoteAddr.sin_addr),ntohs(remoteAddr.sin_port));

	int offsetLen = 0;
	int ret = 0;
	//接收数据
	while (true){
		ret = recv(sClient, revData+offsetLen, 128-offsetLen, 0);
		if (ret > 0){
			offsetLen += ret;
			if (offsetLen >= 128 || revData[offsetLen - 1] == 0x0a){
				revData[offsetLen - 1] = 0x00;
				break;
			}
		}
		else{
			break;
		}
	}
	
	printf("recive message: %s", revData);

	//发送数据
	send(sClient, revData, strlen(revData), 0);

	//释放资源
	closesocket(sClient);
	closesocket(slisten);
	WSACleanup(); 

	return 0;
}

C++版(利用的boost的asio库,编译需要添加boost到路径中去):

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class EchoConection
	:public boost::enable_shared_from_this<EchoConection>
{
public:
	typedef boost::shared_ptr<EchoConection> pointer;
	static pointer create(boost::asio::io_service& io_service)
	{
		return pointer(new EchoConection(io_service));
	}
	tcp::socket & socket()
	{
		return socket_;
	}
	void start()
	{
		std::cout<<socket_.remote_endpoint().address()<<":";
		std::cout<<socket_.remote_endpoint().port()<<" conction\n";
		boost::system::error_code error;
		handle_read(error,0);
	}
private:
	EchoConection(boost::asio::io_service& io_service)
		:socket_(io_service)
	{
	}
	void handle_write(const boost::system::error_code &error ,size_t transftran)
	{
		if (!error)
		{
			if (buf_[0]=='\n')
			{
				std::cout<<"recive message: "<<ss_.str()<<std::endl;
				ss_<<"\n";
				boost::asio::async_write(socket_,boost::asio::buffer(ss_.str()),
					boost::bind(&EchoConection::handle_read,
					shared_from_this(),
					boost::asio::placeholders::error,
					boost::asio::placeholders::bytes_transferred));
				ss_.str("");
			}
			else if(buf_[0]== 'q')
			{
				std::cout<<socket_.remote_endpoint().address()<<":";
				std::cout<<socket_.remote_endpoint().port()<<" realse conction\n";
				socket_.close();
			}
			else
			{
				ss_<<buf_[0];
				boost::system::error_code error;
				handle_read(error,0);
			}

		}
		else
		{
			std::cout<<error.message()<<std::endl;
		}

	}
	void handle_read(const boost::system::error_code & error ,size_t transftran)
	{
		if (!error)
		{
			boost::asio::async_read(socket_,boost::asio::buffer(buf_),
				boost::asio::transfer_at_least(1),
				boost::bind(&EchoConection::handle_write,
				shared_from_this(),
				boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
		}
		else
		{
			std::cout<<error.message()<<std::endl;
		}

	}
	tcp::socket socket_;
	std::stringstream ss_;
	char buf_[1];
};
class EchoService
{
public:
	EchoService(boost::asio::io_service& io_service)
		:acceptor_(io_service,tcp::endpoint(tcp::v4(),8880))
	{
		start_accept();
	}
private:
	void start_accept()
	{
		EchoConection::pointer new_connection = 
			EchoConection::create(acceptor_.get_io_service());

		acceptor_.async_accept(new_connection->socket(),
			boost::bind(&EchoService::handle_accept,this,new_connection,
			boost::asio::placeholders::error));
	}
	void handle_accept(EchoConection::pointer new_connection,
		const boost::system::error_code& error)
	{
		if (!error)
		{
			new_connection->start();
		}
		start_accept();
	}

	tcp::acceptor acceptor_;
};

int RunEchoService_main()
{
	try
	{
		boost::asio::io_service io_service;
		EchoService server(io_service);
		io_service.run();
	}
	catch(std::exception & e)
	{
		std::cerr<<e.what()<<std::endl;
	}
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	RunEchoService_main();
	return 0;
}

C#版:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace EchoService
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 8880;
            string host = "127.0.0.1";
            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.Bind(ipe);
            s.Listen(0);
            Console.WriteLine("wait for client connection...");
            Socket csocket = s.Accept();
            Console.WriteLine("accept client:   "+csocket.RemoteEndPoint.ToString());
            string recvStr = "";
            byte[] recvBytes = new byte[128];
            int offsetLen = 0;
            while(true){
                csocket.Receive(recvBytes, offsetLen, 1,SocketFlags.None);
                offsetLen++;
                if (offsetLen >= 128 || (recvBytes[offsetLen - 1] == 0x0d))
                {
                    break;
                }
            }
            recvStr += Encoding.ASCII.GetString(recvBytes, 0, offsetLen-1);
            Console.WriteLine("recive message:   {0}", recvStr);
            csocket.Send(Encoding.ASCII.GetBytes(recvStr));
            csocket.Close();
            Console.ReadLine();
        }
    }
}

java版:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleEchoService {
	public static void main(String[] args) throws IOException {
		String host = "127.0.0.1";
		int port = 8880;
		ServerSocket ss = new ServerSocket();
		ss.bind(new InetSocketAddress(host,port));
		System.out.println("wait for client connection...");
		Socket cs = ss.accept();
		System.out.println("accept client:  "+cs.getRemoteSocketAddress());
		OutputStream os = cs.getOutputStream();
		InputStream is = cs.getInputStream();
		byte [] bys = new byte[128];
		int offsetLen=0;
		while(true){
			is.read(bys, offsetLen, 1);
			offsetLen++;
			if(offsetLen >= 128 || bys[offsetLen-1]==0x0d){
				break;
			}
		}
		System.out.println("revice message: "+new String(bys));
		
		os.write(bys);
		
		is.close();
		os.close();
		cs.close();
		ss.close();
	}
}

python版:

import socket
import sys
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_address = ('localhost',8880);
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)
sock.listen(1)

while True:
    print >> sys.stderr, 'waiting for a connection'
    connection,client_address = sock.accept()
    try:
        print >>sys.stderr,'connectino from',client_address  
        line="";
        while True:
            data = connection.recv(16)
            if data=="\r\n":
                break;
            line=line+data;
        print >>sys.stderr,"received message: %s " % line
        if line:
            print >>sys.stderr,"sending data back to the client"
            connection.sendall(line)
        else:
            print >> sys.stderr,"no data from",client_address
            break;            
    finally:
        connection.close()

总结:

1,python,java,C#版代码都比较简单易懂。大概流程就是构造socket,绑定,监听,接收数据,发送数据,关闭资源

2,C写的比较长,但是它们基础,因为window系统中,java,C#,python,基本上都是调用的WSA系列函数接口。

3,C++写的比较复杂,因用用的asio库, 就是一个connection对象,一个service对象,利用回调函数循环监听接收发送数据,是更高层次的封装。



ipad编程软件python-Notepad++配置Python开发环境的图文详解 Notepad++ 是一款非常有特色的编辑器,软件小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS,python 等。是程序员必备开源软件,可以免费使用,同时也支持各类流行的计算机编程语言。编辑器可以运行在微软的windows系统环境下,它的使用是受GPL许可证保护的,支持的语言:C、C++JavaC#、XML、HTML、PHP、Javas... 阅读详情

相关推荐

Echo.Net:C#远程控制(服务端、客户端)

[C#/WPF]Echo.Net C#远程控制(服务端、客户端) 主要功能有屏幕监控、鼠标键盘控制、任务管理器、Telnet、系统信息查看、关机注销重启等 主要用于学习并熟悉C#... 熟悉了XML的序列化、反序列化,Socket通讯,Win32API调用等

使用python编写基于UDP协议的通讯程序,实现简单的回声功能(附代码)

编写基于UDP协议的通信程序,包括Server与Client两个部分。实现回声程序:即客户端发送消息,服务器端将收到的消息原样会送给客户端。

jiqiu12的博客 1664

PythonRocklion:python的回声程序

PythonRocklion:python的回声程序

python程序运行按什么键_如何编写和运行Python程序

本篇介绍在Windows、Linux、Mac OS不同环境下如何编写和运行Pyhton程序。通过本篇的学习,可以达成如下目标。● 使用Pyhton自身提供的交互式解释器编写Python程序● 使用Python自身提供的IDLE集成开发环境编写Python程序● 使用eclipse集成开发环境编写Python程序1、使用Pyhton自身提供的交互式解释器在Linux、Windows、Mac OS的命...

weixin_39983912的博客 928

C# 网络编程 echo

using System.Collections; using System.Collections.Generic; using System.Net.Sockets; using UnityEngine; using UnityEngine.UI; using System; public class Echo : MonoBehaviour { Socket socket; public InputField inputField; public Text text;

qq_36382679的博客 380

使用python基于多线程的并发服务器设计,实现回声功能。(附代码)

编写基于TCP协议的通信程序,包括Server与Client两个部分。基于多线程的并发服务器设计,实现回声程序:即客户端发送消息,服务器端将收到的消息原样会送给客户端。

jiqiu12的博客 829

python 分支结构编程 请用一行代码,编写一个回声程序,将用户输入的内容直接打印出来。

请用一行代码,编写一个回声程序,将用户输入的内容直接打印出来。 示例 代码 print( input( ) )

m0_47161653的博客 9118

主流编程语言全景解析:从C到Rust,如何根据项目需求选择最合适的工具

编程语言是软件开发的基石,其核心在于将人类逻辑转化为机器可执行的指令。不同语言的设计哲学和实现原理决定了它们在性能、安全性、开发效率上的根本差异。从贴近硬件的系统级语言到注重开发效率的脚本语言,每种语言都通过独特的语法规则、内存管理模型和运行时环境来解决特定领域的工程问题。理解这些底层原理,对于构建高性能系统、保障软件安全、提升团队协作效率具有决定性意义。例如,在需要极致性能和对硬件进行精细控制的场景,如操作系统内核或高频交易系统,C++和Rust通过零成本抽象和编译期安全检查提供了解决方案;而在快速原型开

weixin_33968104的博客 510

AI、算法与后端开发:JavaPython、Go、C#、Rust 语言选型与学习路线实战指南

在软件开发领域,编程语言是构建应用的核心工具,其选择直接影响开发效率、系统性能与职业路径。从原理上看,不同语言的设计哲学、内存管理模型和并发机制决定了它们各自擅长的场景。例如,Python凭借其简洁语法和丰富的库生态,在AI与算法领域成为事实上的标准,主要承担快速原型验证和实验的角色;而Java、Go和C#等语言则在构建高可靠、高并发的后端业务系统中展现其技术价值。对于开发者而言,理解这些语言的定位比单纯比较语法更重要。在实际应用场景中,AI模型研发几乎离不开Python生态(如PyTorch、Tensor

weixin_30457465的博客 398

C#Java 的终极对比:语法、场景、面试与选型指南

C#Java 是两种主流的静态强类型语言,均运行在虚拟机之上,但语法细节与生态差异显著。C# 在 Windows 桌面、工业上位机、Unity 游戏和跨平台服务端中开发效率突出,LINQ、async/await 等特性让代码更简洁;Java 依托 JVM 与 Spring Boot 生态,在企业后端、大数据和安卓领域占据主导地位,Java 面试中的 JVM、集合、多线程等八股文考察也更为标准化。从类型系统、集合操作、异步模型、典型应用场景出发,结合字符串处理、服务端接口、串口工具等实际代码对照,并梳理

weixin_34122604的博客 345

下列快捷键中能中断python程序运行的是_在notepad++中实现直接运行python代码

Notepad++ 是一款非常有特色的编辑器,软件小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS,python 等。是程序员必备开源软件,可以免费使用,同时也支持各类流行的计算机编程语言。编辑器可以运行在微软的windows系统环境下,它的使用是受GPL许可证保护的,支持的语言:C、C++JavaC#、XML、HTML、PHP、Javas...

weixin_39981041的博客 465

运行python程序的两种方式交互式和文件式_教你如何编写、保存与运行 Python 程序...

第一步 接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Python 来运行的你的程序有两种方法——使用交互式解释器提示符或直接运行一个源代码文件.我们将了解如何使用他们二者的功能. 使用解释器提示符 在你的操作系统中打开终端(Terminal)程序(正如我们先前在安装章节所讨论...

weixin_39646688的博客 7592

FF Proxy客户端全攻略:C、Node.js、Python等5种语言快速接入指南

FF Proxy作为一款高性能的UDP转TCP代理服务器,能够实现零往返发送HTTP请求,显著提升网络请求效率。本文将详细介绍如何通过C、Node.js、Python等五种主流编程语言快速接入FF Proxy客户端,帮助开发者轻松集成这一强大工具。 ## 🚀 为什么选择FF Proxy? FF Proxy(全称GitHub加速计划)的核心优势在于其创新的"零往返"请求模式,通过UDP协议向代

gitblog_00368的博客 279

第一篇BLOG—Hello world!

论如何Hello world! Hello world! 本篇来教你如何花式Hello world! C#include <stdio.h> int main(){ printf("Hello world!\n"); return 0; }Cint main(){ __builtin_printf("Hello world!\n"); return 0; }C+

daklqw的博客 698

Rust Go C# PHP等编程语言就业前景与学习指南:2026年技术选型全攻略

Go是当前。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 744

互联网系统中的利器thrift(一)简介

http://www.code-trick.com/thrift-1/ 现如今互联网系统越来越复杂,程序员的分工越来越细,如WEB前端使用PHP,后台某些服务使用Python或者C/C++或者nodejs,再或者是erlang开发提供的服务,那如何让这些服务之间可以非常容易的交互呢,google提供了protobuf,而facebook提供了thrift,关于这两者之间的详细的性能评

hzcyclone的专栏 766

notepad 运行python语言_在notepad++中实现直接运行python代码

Notepad++ 是一款非常有特色的编辑器,软件小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS,python 等。是程序员必备开源软件,可以免费使用,同时也支持各类流行的计算机编程语言。编辑器可以运行在微软的windows系统环境下,它的使用是受GPL许可证保护的,支持的语言:C、C++JavaC#、XML、HTML、PHP、Javas...

weixin_29807369的博客 569

多种编程语言的“hello world!”

by-小世界http://redcisco.blog.163.com资料参考:http://www2.latech.edu/~acm/HelloWorld.htmlC#include main(){printf ("Hello World!\n");}C++#include main(){for(;;){cout }}C#class HelloWorld{  static void Main ()

Daemon 979

1024!

曾子曰:“吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎?” 子曰:“底子入则孝,出则悌,谨而信,泛爱众,而亲仁。行有余力,则以学文” 子曰:“饭疏食,饮水,曲肱而枕之,乐在其中矣!不义而富且贵,于我如浮云。” ...

想练武,就得下功夫 6399
上一篇: 关于安装Genymotion的一些吐槽
下一篇: vim安装中文帮助手册
Feng______
博客等级 码龄16年 19粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值