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 为什么分层 为了简化网络设计的复杂性.通讯协议採用分层结构.各层协议之间既 ...
随机推荐
- vue中keep-alive使用时,注意要点
<keep-alive exclude="QRCode,NewsInfor,VipRecordDetail"> <router-view></rout ...
- 安装rosetta2016时出现git@172.16.25.11s password: \r\nPermission denied错误,解决方法。
当在source目录执行 ./external/scons-local/scons.py -j8 mode=release bin 时,报错 git@.11s password: \r\nPermis ...
- 自己写的一些公共js方法
/* 说明文件:这里用的都是es6的语法 导入导出,拿vue举个栗子,你只需要在用到的地方,按需要导入就行了,然后在mounted中直接可以拿来用 比如下面的手机****方法,在需要用到的地方impo ...
- TP5新增模块
tp5模块自动生成 1build.php配置要生成的目录 <?php// +----------------------------------------------------------- ...
- flask框架中,利用数据库增删查改
# 配置数据库app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:mysql@127.0.0.1:3306/booktest" ...
- h5页面实战——与andriod和ios的交互
首先需要我们h5页面需要做一些匹配.比如:如何判断当前手机是andriod还是ios, andriod攻城狮和ios工程师,一般会定义事件的方法.我们套用他们方法就可以了. 那么为什么我要写这个随笔呢 ...
- JVM进程启动会启动哪些线程?
首先要明白一点:JVM本身是一个多线程的程序,和我们编写的java应用程序一样,当JVM启动执行时就是在操作系统中启动了一个JVM进程.我们编写的java单线程或多线程应用进程都是在JVM这个程序中作 ...
- 用JDBC连接 数据库 进行简单的增删改查
JDBC为java的基础.用jdbc实现对数据库的增删改查的功能是程序员的基本要求.本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包. ...
- JavaScript--鼠标滚动改变图片大小
鼠标滚动改变图片的大小: 原理:当鼠标滚动时改变了zoom的值: <!DOCTYPE HTML> <html> <head> <title>通过鼠标滚轮 ...
- java正则表达式学习笔记
Java 正则表达式语法 为了更有效的使用正则表达式,需要了解正则表达式语法.正则表达式语法很复杂,可以写出非常高级的表达式.只有通过大量的练习才能掌握这些语法规则. 本篇文字,我们将通过例子了解正则 ...