首页 > 编程语言 >C# Socket网络编程

C# Socket网络编程

时间:2023-10-31 09:45:49浏览次数:36  
标签:Console Socket C# 编程 WriteLine var new 客户端

入门级C# Socket编程实现

只要知道要通信的两台主机的IP地址和进程的端口号,然后可以用Socket让这两个进程进行通信。

在本机上运行服务端和客户端,ip为127.0.0.1,使用端口9050(0~1023的端口号通常用于一些比较知名的网络服务和应用,普通网络应用程序则应该使用1024以上的端口号,以避免该端口号被另一个应用或系统服务使用)。

服务端:

var ip   = "127.0.0.1";
var port = 9050;
//第一步:建立一个用于通信的Socket对象
//参数1:指定该IP对应的协议,此为IPv4;参数2:定义要打开的Socket的类型;参数3:向Windows Sockets API通知所请求的协议
var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//第二步:使用bind绑定IP地址和端口号,IPEndPoint内参数为IPAddress的long类型和端口号
var ipEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
serverSocket.Bind(ipEndPoint);

//第三步:使用listen监听客户端,参数为指定侦听队列的容量
serverSocket.Listen(10);

//第四步:使用accept中断程序直到连接上客户端,(接收连接并返回一个新的Socket,Accept会中断程序,直到有客户端连接)
Console.WriteLine("等待客户端连接...");
var socket   = serverSocket.Accept();
var socketip = (IPEndPoint) socket.RemoteEndPoint;
Console.WriteLine($"连接成功! ip:{socketip.Address}  端口:{socketip.Port}");

//第五步:接收来自客户端的请求,用死循环来不断的从客户端获取信息
while (true)
{
    var receiveBytes = new byte[1024];
    var receive      = socket.Receive(receiveBytes);
    if (receive == 0 || Encoding.UTF8.GetString(receiveBytes, 0, receive) == "exit") //当信息长度为0或收到exit,说明客户端连接断开
    {
        break;
    }

    Console.WriteLine(Encoding.UTF8.GetString(receiveBytes, 0, receive)); //将指定字节数组中的一个字节序列解码为一个字符串
}

//第六步:返回客户端的数据
var send = new byte[1024];
send = Encoding.UTF8.GetBytes("服务端已关闭!");
socket.Send(send);

//第七步:如果接收到客户端已关闭连接信息就关闭服务器端,并返回信息
serverSocket.Close();
socket.Close();
Console.WriteLine("服务端关闭...");

客户端:

var ip   = "127.0.0.1";
var port = 9050;
//第一步:建立一个用于通信的Socket对象
var ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//第二步:根据指定的IP和端口连接服务器
//IPAddress:包含了一个IP地址;IPEndPoint:包含了一对IP地址(IPAdress类型)和端口号
var ipEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
ClientSocket.Connect(ipEndPoint);

//第三步:连接成功后向服务器端发送数据请求
while (true)
{
    var send = new byte[1024];
    Console.WriteLine("请输入要发送的数据:");
    var str = Console.ReadLine();
    send = Encoding.UTF8.GetBytes(str);
    ClientSocket.Send(send);
    if (str == "exit")
    {
        Console.WriteLine("已退出...");
        break;
    }

    Console.WriteLine("发送成功!" + "\n");
}

//第四步:接收服务器返回的请求数据
var receiveBytes = new byte[1024];
var receive      = ClientSocket.Receive(receiveBytes);
Console.WriteLine(Encoding.UTF8.GetString(receiveBytes, 0, receive));

//第五步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信息
ClientSocket.Close();

通讯:

 

标签:Console,Socket,C#,编程,WriteLine,var,new,客户端
From: https://www.cnblogs.com/shieryoufeng/p/17799562.html

相关文章

  • CF1889B
    题面给一个\(n\)个点的图,每个点\(i\)有点权\(a_i\),初始图上没有边,你可以进行如下操作若干次:若\(S_i+S_j\gei\timesj\timesc\),添加一条边\((i,j)\)。其中\(S_i\)表示\(i\)所在连通块的点权和,\(c\)是一个给定的常数。问最终能否使图联通。首先我们有一个简......
  • Sourcetree 合并分支到主干
     现在要合并dev分支到prd分支1、首先切换到dev分支,然后拉取代码,然后切换到prd分支,拉取代码;2、然后右击dev分支3、选择合并dev分支至当前分支(当前分支为prd分支)4、然后prd分支会显示有多个文件待推送,推送到仓库即可......
  • (原创)安卓快速使用简单的RecyclerView
    原创声明:本文所有图片和代码皆由本人制作和编写。目录前言目标与效果3步走第一:在布局文件添加RecyclerView组件第二:创建适配器为适配器提供每一个小条目的布局为适配器提供要显示的内容数据在适配器里完成事件监听器第三:把第一步的布局里的RecyclerView组件和第二步的适配器关联......
  • css面试题
    1.css中的哪些单位 绝对单位:  px:像素单位 相对单位:  em:相对父元素字体大小  rem:相对根元素字体大小2.居中的方式1.水平居中1.设置盒子:margin:0auto2.display: flex2.垂直居中   1.vertical-align:middle 实现居中,1. display:i......
  • SFNet_FFTBlock验证模块的有效性
    五、序号5,使用identityConv进行残差连接,最后对增强后的幅值、增强后的相位、空域进行ConcatclassYYBlock(nn.Module):def__init__(self,in_channel=3,out_channel=20,relu_slope=0.2):super(YYBlock,self).__init__()self.spatialConv=nn.Sequ......
  • CRMchat开源客服系统-界面版权去除与修改
    前端界面去除版权 修改界面进入template/admin目录安装依赖npminstall开发模式运行修改vue.config.js中的,此处反代线上网址```devServer:{proxy:'http://crmchat.v1kf.com'},```聊天页面版权template\admin\src\pages\kefu\externalConnection\pcCustomerServer.vu......
  • c++ ftp上传下载
    #include<afxinet.h>intmain(){BOOLdRes,pRes;HINTERNEThInternet;HINTERNEThConnect;hInternet=InternetOpen("A3GSSample",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,INTERNET_FLAG_NO_CACHE_WRITE);if(NULL==hInternet){printf("Inter......
  • livecd修改系统密码
    1.制作livecd引导盘,从livecd启动设备2.将原系统作为普通硬盘挂载到livecd系统上注意:如果原系统做了lvm,需要挂载逻辑卷mkdir/mnt/systemmount/dev/mapper/openkylin-root/mnt/system3.chroot到原系统chroot/mnt/system4.修改密码echouser_name:new_password|chp......
  • 5.手写reduce
    我们首先先创建一个index.js的文件在文件中定义一个数组,就像这样constarr=[1,2,3,4,5];constres=arr.reduce(function(sum,item){returnsum+item;});console.log(res);使用nodeindex.js运行这段代码,我们可以看到输出的结果是15现在让我们来实现自己......
  • PyCharm快捷键
                                                                ......