1)         流程

2)         服务端程序特点
Ø 一般启动后就一直处于运行状态,以等待客户端进程的请求
Ø 使用的端口往往是熟知端口,便于客户机进程连接请求
Ø 一般拥有较多的系统资源,以便及时响应各个客户机进程的请求
Ø 可以并行处理多个客户机进程的请求,但数目是有一定的限制
Ø 在通信时一般处于被动的一方,不需要知道客户机的IP地址和端口信息
3)         客户端程序特点
Ø 在需要服务端进程的服务时将向服务器进程请求服务,并建立通信连接,得到满足并完成处理后就终止通信连接
Ø 使用向系统申请的临时端口与服务端进程进行通信,通信完成后将释放该端口
Ø 拥有相对较少的系统资源
Ø 在通信时属于主动地一方,需要事先知道服务端的IP地址和端口信息
4)         套接字
套接字可以理解为通信连接的一端,其主要包括协议、主机IP地址和端口号,将两个套接字连接到一起便可以再不同应用进程之间传递数据,因此套接字实现了对网络和传输层协议的封装,为应用进程之间的通信连接的建立、数据传输等通信过程提供了编程界面,使用套接字进行通信示意图为:

5)         工作模型

2.         创建工程

文件à新建à项目

在模板中选中控制台应用程序,输入名称后,单击浏览选择保存的位置,单击确定,同样的方法建立好客户端的工程
3.         服务端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace server
{
class Program
{
static void Main(string[] args)
{
try
{
IPAddress Ip = IPAddress.Parse("127.0.0.1");
 //IPAddress提供网际协议地址的类,Parse将IP地址字符串转换为IPAddress的实例
TcpListener TcpList = new TcpListener(Ip, 8888);
 //TcpListener网络侦听类,从TCP网络客户端侦听连接,TcpListener (参数1,参数2),参数1表示本地IP地址,参数2表示用来侦听传入的端口连接
TcpList.Start();
//启动对挂起连接数的传入链接请求的侦听
Console.WriteLine(“Server start!”);
Console.WriteLine(“Ip address:” + TcpList.LocalEndpoint);
 //LocalEndpoint获取服务端(即本地)地址与端口等信息
Console.WriteLine(“Wait”);
Socket Soc = TcpList.AcceptSocket();
 //AcceptSocket表示接受挂起的连接请求,Socket为套接字接口的类
Console.WriteLine("Received Connection:" + Soc.RemoteEndPoint);
 //RemoteEndPoint获取客户端地址与端口等信息
byte[] b = new byte[100];
int k = Soc.Receive(b);
 //Soc.Receive(b)从socket接收数据,将数据存入接收缓冲区列表中,k的值为该数据的长度
Console.WriteLine(“Received data from client:”);
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(b[i]));
 //Convert.ToChar(b[i])将数组b转换基本数据类型为char的类型并输出
ASCIIEncoding AS = new ASCIIEncoding();
 //ASCIIEncoding表示Unicode字符的ASCII字符编码类
Soc.Send(AS.GetBytes(“Received data!”));
//Soc.Send向客户端发送数据,AS.GetBytes()获得括号中字符串的bytes值
Soc.Close();
//关闭连接并释放所有关联的资源
TcpList.Stop();
//关闭侦听
Console.ReadLine();
  //等待输入,起到暂停的作用
}
catch(Exception e)
{
Console.WriteLine("Error!" + e.StackTrace);
 //获取当前异常发生时调用堆栈上的帧的字符串
}
}
}
}
4.         客户端
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Net.Sockets;
namespace client
{
class Program
{
static void Main(string[] args)
{
try
{
TcpClient TcpClient = new TcpClient();
 //TcpClient为TCP网络服务提供客户端连接的类
TcpClient.Connect("127.0.0.1", 8888);
//Connect方法使用指定的IP地址和端口号将客户端连接到远程TCP主机
Console.WriteLine("Connect Complete");
Console.WriteLine("Input string:");
String str = Console.ReadLine();
 //定义字符串str变量,保存输入的字符
Stream stm = TcpClient.GetStream();
 //定义数据流,用于发送和接收数据
ASCIIEncoding AS = new ASCIIEncoding();
byte[] b = AS.GetBytes(str);
 //将字符串转换为byte类型
stm.Write(b, 0, b.Length);
//Write(参数1,参数2,参数3)表示向服务端发送字符串,参数1指将此数组复制到当前流,参数2指从零开始的字节偏移量,参数3指要写入当前流的字节数(即字符串长度)
Console.WriteLine("Send Complete");
byte[] bb = new byte[100];
int k = stm.Read(bb, 0, 100);
 //stm.Read在当前流中读入服务端发来的响应信息,其参数与Write方法参数一致,k值为读入字符串的长度
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
TcpClient.Close();
//释放TcpClient实例,并不关闭基础连接
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Error!" + e.StackTrace);
}
}
}
}
5.    测试

运行服务端,提示服务端已启动,IP地址为127.0.0.1,使用的端口为8888,等待客户端的连接

运行客户端,提示连接服务端完成,等待输入需发送的信息

客户端运行后,在服务端上出现客户端地址为127.0.0.1,使用的端口为2094

输入信息hello后回车发送,提示发送完成,并收到由服务器发来的确认接收信息

服务器接收到来自客户端发送的hello

本文出自 “活不明白的博客--技术..” 博客,转载请与作者联系!

转载于:https://www.cnblogs.com/DavidSmith/archive/2011/12/21/2296152.html

C#中面向连接的客户端与服务端编程相关推荐

  1. Java中Socket通信-客户端与服务端相互传输对象数据

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  2. Java中Socket实现客户端和服务端通信(多线程实现全双工通信)

    效果图 目录结构 服务端Server package server;import thread.SocketReader; import thread.SocketWrite;import java. ...

  3. Java中Socket通信-客户端向服务端发送照片

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

  4. Go tcp客户端、服务端编程

    内容参考net包,net包提供了可移植的网络I/O接口,包括TCP/IP.UDP.域名解析和Unix域socket. 虽然本包提供了对网络原语的访问,大部分使用者只需要Dial.Listen和Acce ...

  5. 使用struts2框架中3种客户端向服务端发送请求参数的方式

    1.action属性: 前端参数直接在action属性名之后,如PersonAction?id=1; 在对应的action中加入属性id,必须加对应属性的get(),set()方法,其中属性名应为小写 ...

  6. android studio中使用AIDL进行客户端与服务端互相通信

    前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...

  7. NodeJS SSR服务端渲染:公共代码区分客户端和服务端

    SSR服务端渲染(英语:server side render)指一般情况下,一个web页面的数据渲染完全由客户端或者浏览器端来完成.先从服务器请求,然后到页面:再通过AJAX请求到页面数据并把相应的数 ...

  8. python中使用socket编程实现带有界面的客户端向服务端发送文件和下载文件

    一主界面: **二:发送文件界面:**首先需要开启发送文件服务端(这里需要注意的是每一次发送文件之前都需要开启一次服务端,因为我在这里将每一次发送文件之后就关闭了客户端和服务端之间的连接) 输出相关客 ...

  9. gRPC中Java和node进行异构通信-互为客户端和服务端

    场景 gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

最新文章

  1. 简单做了一个sina微博的MVC第三方登陆
  2. 蚂蚁金服面试3+2次,最终有惊无险通过!
  3. 华为安卓11是鸿蒙系统吗,恭喜华为手机,EMUI11曝光,是披着Android 11的“鸿蒙系统”?...
  4. [AlwaysOn Availability Groups]CLUSTER.LOG(AG)
  5. Java 10:“ var”关键字
  6. SAP License:ERP项目经理需求调研的惨痛经历
  7. Linux 快捷键总结
  8. 单片机之汇编语言和C语言(以PIC单片机为例)
  9. win10用户账号密码重置
  10. 叶罗丽颜值测试软件齐娜多少分,精灵梦叶罗丽:美颜相机下灵公主16岁、齐娜7岁,他竟然拍的46岁...
  11. 夜曲歌词 拼音_周杰伦夜曲乐谱及歌词
  12. 使用Photoshop制作圣诞海报
  13. Macbook Pro M1(macOS 12.0)读取NTFS移动硬盘方法
  14. 人工智能项目商业价值,主要体现在哪几个方面?
  15. 联合国会常务委员会明确破产法规:Arun Jaitley
  16. 再见牛根生,再见英雄时代
  17. python之会动的图片
  18. 【题解】LuoGu1133:教主的花园
  19. 拍案叫绝的算法(二)
  20. 戴尔笔记本win10+ubuntu18.04双系统,强力卸载ubuntu并重装ubuntu18.04+取消自动更新

热门文章

  1. 当前主流量化平台整理201705版
  2. 关于计算机组件游戏,Windows系统运行库/游戏运行库组件怎么补全?
  3. 干货:实现数据可视化的几个工具选择(工具+编程语言)
  4. JAVA将list2合并到list1_java如何将两个list合并的问题
  5. java语言c语言基础_新手入门选什么:有些人说C语言要比Java更难!你应该怎么办?...
  6. Sequential Recommender Systems
  7. vue修改代码同步页面_vue实现两个组件之间数据共享和修改操作
  8. excel常用函数公式及技巧_Excel统计类函数公式应用技巧解读,绝对的硬核干货!...
  9. mysql 8安装 windows xp_postgreSQL[Windows XP]安装问题解决方案:
  10. 新闻列表页flex_使用css3的Flex布局实现列表展示