C#服务器端与客户端通信(初级)

1、套接字编程

Socket:套接字

套接字是支持TCP/IP协议的网络通讯的基本操作单元,可以将套接字看做不同主机的进程进行双向通讯的端点,它构成了单个主机内及整个网络间的编程界面。

IP地址(Internet Protacol):

是互联网设备之间传输数据的一种协议,IP地址就是给每个连接在因特网的主机(或路由器)分配一个在全世界范围内唯一的标识符(类似你的家庭住址)。

端口:

标识某台计算机上的进程。

TCP/IP(传输控制协议/网际协议):

是一组网络通讯协议的总称,它规范了网络上的所有通讯设备,尤其是一个主机与另一个主机之间的数据交换格式以及传输方式

特点:

TCP(传输控制协议)  全双工

基于连接的一种协议

UDP特点:

是一个基于无连接的协议,没有生成连接的系统延迟,所以速度要比TCP快;

支持一对一、一对多的连接,可以使用广播的方式多地址的发送;

消耗的网络带宽更小;

UDP协议传输的数据有消息边界,而TCP是没有的

TCP服务器端代码:

需引用命名空间

using System.Threading;
using System.Net;
using System.Net.Sockets;

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

namespace Server_Tcp
{
class Server
{
private Socket socket; //服务器监听套接字
private bool isListen = true;//判断服务器是否在监听(目的是为了方便退出)
public Server()
{
//定义网络终结点(封装IP和端口)
IPEndPoint endPoint =new IPEndPoint(IPAddress.Parse("127.0.0.1"),9999);
//实例化套接字(监听套接字)
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
//服务器端绑定地址
socket.Bind(endPoint);
//开始监听
socket.Listen(10);//10表示“监听对列”的最大长度
Console.WriteLine("服务器端已经启动");
try
{
while (isListen)
{
//Accept()接收客户端的连接
//会阻断当前线程的进行
Socket acceptSocket = socket.Accept();
Console.WriteLine("有一个客户端连接。。。。。。");
//开启一个后台线程,进行客户端的会话
Thread clientMsg = new Thread(ClientMsg);
clientMsg.IsBackground = true;//设置为后台线程
clientMsg.Name = "clientMsg";//设置线程名字
clientMsg.Start(acceptSocket);
}
}
catch (Exception)
{
}
}
/// <summary>
/// 服务器端和客户端通讯的后台线程方法
/// </summary>
/// <param name="sockMsg"></param>
public void ClientMsg(object sockMsg)
{
Socket socketMsg = sockMsg as Socket;//通讯Socket
while (true)
{
//准备一个“数据缓存(数组)”
byte[] msg = new byte[1024 * 1024];
//接收客户端发来的数据,返回数据真实长度
int count = socketMsg.Receive(msg);
//byte数组转换为string
string str = Encoding.UTF8.GetString(msg, 0, count);
//显示客户端发过来的数据
Console.WriteLine("客户端发过来的数据:"+str);
}

}
static void Main(string[] args)
{
Server server = new Server();
}

 TCP客户端代码:

需引用命名空间

using System.Net;
using System.Net.Sockets;

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

namespace Client_Tcp
{
class Client
{
private Socket clientSocket;//客户端通讯套接字
private IPEndPoint serverEndPoiint;//连接到的服务器IP和端口
public Client()
{
serverEndPoiint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),9999);
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
clientSocket.Connect(serverEndPoiint);
}
catch (Exception)
{
}
}
public void SendMsg()
{
while (true)
{//输入数据
string str = Console.ReadLine();
//转换为字节
byte[] byteArray = Encoding.UTF8.GetBytes(str);
//发送数据
clientSocket.Send(byteArray);
Console.WriteLine("我:"+ str);
}
//关闭连接
clientSocket.Shutdown(SocketShutdown.Both);
//清理连接资源
clientSocket.Close();
}
static void Main(string[] args)
{
Client client = new Client();
client.SendMsg();
}
}
}

UDP接收端代码:

需引用命名空间

using System.Net;
using System.Net.Sockets;

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

namespace Server_Udp
{
class Server
{
private IPEndPoint serverEndPoint;
private Socket serverSocket;
public Server()
{
serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),12345);
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
serverSocket.Bind(serverEndPoint);
EndPoint ep = (EndPoint)serverEndPoint;
while (true)
{
byte[] byteArray = new byte[1024*1024];
int count = serverSocket.ReceiveFrom(byteArray,ref ep);
string str = Encoding.UTF8.GetString(byteArray,0,count);
Console.WriteLine("客户端发来的信息:"+str);
}
}
static void Main(string[] args)
{
Server server = new Server();
}
}
}

UDP发送端代码:

需引用命名空间

using System.Net;
using System.Net.Sockets;

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

namespace Client_Udp
{
class Client
{
private IPEndPoint clientEndPoint;
private Socket clientrSocket;
public Client()
{
clientEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
clientrSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = (EndPoint)clientEndPoint;
while (true)
{
string str = Console.ReadLine();
byte[] byteArray = new byte[1024 * 1024];
byteArray = Encoding.UTF8.GetBytes(str);
clientrSocket.SendTo(byteArray,ep);
Console.WriteLine("我发的信息:" + str);
}
}
static void Main(string[] args)
{
Client client = new Client();
}
}
}

原文地址:https://www.cnblogs.com/Damon-3707/p/11693079.html

时间: 2024-11-13 08:17:21

C#服务器端与客户端通信(初级)的相关文章

JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. 网络分层除了OSI模型分层,还有TCP/IP模型分层,将网络划分为四层,应用层.传输层.网际层

网络编程 实现 客户端与服务器端的简单通信

六,代码演示实现客户端与服务器端的简单通信 代码中所使用的 IP号码,必须是本机自己的IP号码 (自行查询:cmd---ipconfig/all ) 1.[客户端向服务器端 发送一个整型数据,服务器端进行接收] (1)先写服务器端 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java

QT实现TCP通信服务器端和客户端(支持多个客户端)精简版

上星期接了个私活,工期两星期,报酬3000,写一个小软件,采集定向网络上的数据,并进行双向通信,捣鼓了两天,终于把QT中tcp通信这块调通了,找过N多例子,绝大部分都是基本的一个服务端一个客户端通信的,而且都不完整,甚至有些还发完数据就关闭了,还是自己亲自操刀先做了个TCP小工具,基本的需求搞定.window.open('http://www.qtcn.org/bbs/attachment/Mon_1309/44_110085_04c150bde9df7ee.jpg?67');" style=&

基于C/S架构的3D对战网络游戏C++框架 _01服务器端与客户端需求分析

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

服务器端获取客户端的IP地址(当客户端调用由Axis开发的WebService)

一.前言 由于项目中一个小的模块需要获取客户端的IP地址以保证安全调用webservice接口,项目中客户端使用C#编写,服务器端使用Java编写,服务器端与客户端采用Axis开发的WebService进行通信.服务器端维护IP白名单列表,只有IP地址在白名单中的客户端才可以成功调用到接口,获得服务. 二.代码清单 若要成功获取客户端IP地址,需要如下Jar包的支持. servlet-api.jar axis.jar axis2-kernel-1.6.2.jar 获取IP地址的具体代码如下: i

C#使用Socket实现一个socket服务器与多个socket客户端通信

在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发,要维护数据库中任务记录状态等等.开发的东西还是有点多,而且还不够灵活.因此,我个人是比较偏向于使用socket来实现任务的调度工作.原因:使用socket实现调度比较灵活,而且扩展性都比较好. 实现思路:调度服务器要实现调度工作,它必须与所有计算节点之间建立连接.而且他需要知道每台计算节点的任务状

64位Window操作系统下,Orcal数据访问服务器端和客户端版本对应与通讯问题

最近做一个小系统,需要在客户现场搭建数据库环境.之前我们一直访问的是公司的一个测试库,现在需要在现场开发,现场的Orcal服务器已经装好的是 12C ,我们本不打算重装服务器端orcal,故将我们自己电脑的orcal客户端重装为10.2,试图与12C的客户端进行匹配,但是10.2的客户端与12C的服务器端根本无法通信,我们又尝试将服务器端orcal 降级为11g,竟然可以正常访问数据. 小结为:orcal服务端与客户端的版本兼容问题,就目前来讲客户端的10.2和服务器端的11g可以正常访问. o

[Python]通过websocket与js客户端通信

网站大多使用HTTP协议通信,而HTTP是无连接的协议.只有客户端请求时,服务器端才能发出相应的应答,HTTP请求的包也比较大,如果只是很小的数据通信,开销过大.于是,我们可以使用websocket这个协议,用最小的开销实现面向连接的通信. 具体的websocket介绍可见http://zh.wikipedia.org/wiki/WebSocket 这里,介绍如何使用Python与前端js进行通信. websocket使用HTTP协议完成握手之后,不通过HTTP直接进行websocket通信.

Java网络编程——服务器端和客户端互发信息

引言 ? ? 为了学习Java网络编程,用一个QQ(屌丝版)作为例子练手,记录屌丝版QQ的开发过程,这里我们认为已经掌握其中的网络基础部分,即HTTP协议,TCP/IP协议等,在此基础上我们开始我们的Java网络部分的学习,我们要知道服务器和客户端是如何通信的,首先我们要了解Java网络知识中的一个很重要的东西--Socket ? ? Socket初探 ? ? ServerSocket和Socket ? ? 首先服务器端需要用到java.net包下的ServerSocket类,该类的一个实例用于