C#socket编程之实现一个简单的TCP通信
TCP(TransmissionControl Protocol)传输控制协议。
是一种可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket()。
2、设置socket属性。
3、绑定本机的IP地址、端口等信息到socket上,用函数bind()。
4、开启监听,用函数listen()。
5、接收客户端上来的连接,用函数accept()。
6、通过accept()返回相应客户端的socket建立专用的通信通道。
7、收发数据,用函数send()和recv(),或者read()和write()。
8、关闭网络连接。
9、关闭监听。
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket()。
2、设置socket属性。
3、设置要连接的对方的IP地址和端口等属性。
4、连接服务器,用函数connect()。
5、收发数据,用函数send()和recv(),或者read()和write()。
6、关闭网络连接。
---------------------
作者:subin_iecas
来源:CSDN
原文:https://blog.csdn.net/subin_iecas/article/details/80289513
下面是一个简单的TCP的通信程序源码
主要功能是模拟一个群聊,当多个客户端连接进来后,任意一个客户端发送的消息都将被服务器端接收并群发给所有客户端
服务器端:
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 _037_test
{
class Program
{
static void Main(string[] args)
{
Server s = new Server("192.168.0.105", );
s.Start();
}
}
}
Program.CS
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 _037_test
{
class Server
{
Socket serverSock;
List<Socket> clientList = new List<Socket>();
public Server(string ip, int port)
{
//创建socket套接字
serverSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//检测ip地址是否有误
IPAddress ipAdd;
if (!IPAddress.TryParse(ip, out ipAdd))
{
Console.WriteLine("ip有误,服务器创建失败");
return;
}
//绑定ip地址和端口;
IPEndPoint point = new IPEndPoint(ipAdd, port);
serverSock.Bind(point);
//无限监听接收
serverSock.Listen(); } public void Start()
{
Thread th = new Thread(AcceptClient);
th.Start();
SendToAll();
} public void AcceptClient()
{
Console.WriteLine("等待连接");
while (true)
{
Socket client = serverSock.Accept();//等待接收用户的连接,并返回连接成功的用户
IPEndPoint clientPoint = client.RemoteEndPoint as IPEndPoint;//获取所连接的用户的ip
Console.WriteLine(clientPoint.Address+"已连接");
clientList.Add(client);
Thread clientT = new Thread(ReceiveMessage);
clientT.Start(client);
}
} public void SendToAll()
{
while (true)
{
string message = "管理员:"+Console.ReadLine();
byte[] messageBytes = Encoding.Default.GetBytes(message);
for (int i = ; i < clientList.Count; i++)
{
try
{
clientList[i].Send(messageBytes);
}
catch (SocketException)
{
Console.WriteLine("有一个客户端下线");
clientList.RemoveAt(i);
i--;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
} public void ReceiveMessage(object obj)
{
while (true)
{
Socket client = obj as Socket;//将线程的start方法传入的obj转回socket类型
byte[] messageBytes = new byte[ * ];//数据容器
try
{
int num = client.Receive(messageBytes);//receive方法返回字节长度,并把内容存在传入的数组中
IPEndPoint clientPoint = client.RemoteEndPoint as IPEndPoint;//获取所连接的用户的ip
Console.WriteLine(clientPoint.Address+":" + Encoding.Default.GetString(messageBytes, , num)); //服务器端负责将从客户端收到的消息转发给所有客户端
string message = clientPoint.Address + ":" + Encoding.Default.GetString(messageBytes, , num);
foreach (var item in clientList)
{
if (item!=client)
{
item.Send(Encoding.Default.GetBytes(message));
}
}
}
catch (Exception)
{
Console.WriteLine("有一个客户端离开");
clientList.Remove(client);
break;
}
} }
}
}
Server.CS
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace _038_test
{
class Program
{
static void Main(string[] args)
{
Client c = new Client("192.168.0.105", );
c.Start();
}
}
}
Program.CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace _038_test
{
class Client
{
Socket clientSock;
public Client(string ip, int port)
{
clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
IPEndPoint point = new IPEndPoint(IPAddress.Parse(ip), port);
clientSock.Connect(point);
}
catch (Exception)
{
Console.WriteLine("服务器没有开启");
return;
} Console.WriteLine("已连接服务器");
} public void Start()
{
Thread th = new Thread(SendMessage);
th.Start();
ReceiveMessage();
} public void SendMessage()
{
try
{
while (true)
{
string message = Console.ReadLine();
byte[] messageBytes = Encoding.Default.GetBytes(message);
clientSock.Send(messageBytes);
}
}
catch (Exception)
{
Console.WriteLine("服务器断开");
return;
} } public void ReceiveMessage()
{
try
{
while (true)
{
byte[] messageBytes = new byte[ * ];
int num = clientSock.Receive(messageBytes);
Console.WriteLine(Encoding.Default.GetString(messageBytes, , num));
}
}
catch (Exception)
{
Console.WriteLine("服务器断开");
return;
}
} }
}
Client.CS
运行结果:
C#socket编程之实现一个简单的TCP通信的更多相关文章
- Linux socket编程示例(最简单的TCP和UDP两个例子)
一.socket编程 网络功能是Uinux/Linux的一个重要特点,有着悠久的历史,因此有一个非常固定的编程套路. 基于TCP的网络编程: 基于连接, 在交互过程中, 服务器和客户端要保持连接, 不 ...
- 利用JSP编程技术实现一个简单的购物车程序
实验二 JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...
- 27、通过visual s'tudio 验证 SOCKET编程:搭建一个TCP服务器
本文就是在windows下进行socket编程,搭建一个TCP客户端. 在visual studio下编程,首先在windows下进行初始化(这点在linux下是不需要的): /* 初始化 Winso ...
- 一个简单的tcp代理实现
There are a number of reasons to have a TCP proxy in your tool belt, bothfor forwarding traffic to b ...
- 【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。
在新建的 C++源文件中编写如下代码. 1.TCP 服务器端#include<winsock2.h> //包含头文件#include<stdio.h>#include<w ...
- Node.js实战14:一个简单的TCP服务器。
本文,将会展示如何用Nodejs内置的net模块开发一个TCP服务器,同时模拟一个客户端,并实现客户端和服务端交互. net模块是nodejs内置的基础网络模块,通过使用net,可以创建一个简单的tc ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...
- socket编程之中的一个:计算机网络基础
在開始学习网络之前先复习下计算机网络基础吧. 鲁迅说,天下文章一大抄.看你会炒不会炒,基础知识就抄抄书吧. 一 分层模型 1 为什么分层 为了简化网络设计的复杂性.通讯协议採用分层结构.各层协议之间既 ...
随机推荐
- Acrobat Pro DC 2019 mac中文版(pdf编辑器)
为大家准备了最新版本的Adobe Acrobat Pro DC 2019 for Mac,这是Adobe官方推出的pdf编辑器,acrobat pro dc 2019破解版可以轻松将扫描件.图像.网页 ...
- Centos部署PHP项目(安装Apache,PHP)
1.apache安装 [root@tele-2 ~]# yum install httpd 2.外网访问虚拟机中的地址,我们就需要修改一下apache的配置文件 vim /etc/httpd/con ...
- spring boot入门小案例
spring boot 入门小案例搭建 (1) 在Eclipse中新建一个maven project项目,目录结构如下所示: cn.com.rxyb中存放spring boot的启动类,applica ...
- 18.12.02-C语言练习:韩信点兵
C语言练习:韩信点兵 题目说明:本题是中国经典问题,有多种解法,从数论课程角度看,是一个不定方程组,而且答案不唯一. 但这里采用程序解法,使用的是暴力破解.枚举可能的解,然后根据条件判断,满足所有条件 ...
- koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求
koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找. 参考了这个用base64上传图片的例子.https://github.com/Yuki-Mi ...
- vue中样式的典型操作(:class,:style)
<template> <div class="home-wrapper"> <div class="home-top">th ...
- PKCS RSA执行标准
RSA是一种算法,但是,在相关应用的时候,还是需要有一些标准的.这就是pkcs.现在的各种程序中,基本都是遵循这个标准来使用RSA的.最近陆续读取RSA相关的内容进行学习. RSA官网:https:/ ...
- 无序数组求第k大/第k小的数
根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: ...
- 区块链名词解析:ICO、IFO、IEO和IMO,分别是什么呢?
区块链名词解析:ICO.IFO.IEO和IMO,分别是什么呢?本部分给出了标准答案,但其相当枯燥乏味,建议快进. ICO(Initial Coin Offering),首次代币发行,指区块链项目首次向 ...
- Net Core API网关Ocelot
Ocelot在github的地址 https://github.com/TomPallister/Ocelot , 非常给力的是在课程当天完成了.NET Core 2.0的升级,升级过程请看https ...