C#中网络通信
一、服务端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 网络编程.SockteHandel
{
/// <summary>
/// 服务端处理类
/// </summary>
publicclassServerHandle
{
/// <summary>
/// 端口号
/// </summary>
publicstaticstringPoint{ get;set;}
/// <summary>
/// IP地址
/// </summary>
publicstaticstringIpSite{ get;set;}
/// <summary>
/// 服务端信息
/// </summary>
publicstaticTextBoxServerMsg{ get;set;}
/// <summary>
/// 接收到客户端的消息
/// </summary>
publicstaticTextBoxReceiveMsg{ get;set;}
/// <summary>
/// 发送消息
/// </summary>
publicstaticTextBoxSendMessage{ get;set;}
/// <summary>
/// 负责通信的Socket
/// </summary>
privateSocketConnectionSocket;
/// <summary>
/// 监听端口
/// </summary>
publicvoidWatchPort()
{
//在服务器端创建一个负责监听ID跟端口号 的Socket
Socket socketWatch =newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//IPAddress ip = IPAddress.Any; //监听
IPAddress ip =IPAddress.Parse(IpSite);
//创建端口号对象
IPEndPoint pointObj =newIPEndPoint(ip,Convert.ToInt32(Point));
//监听
socketWatch.Bind(pointObj);
ServerMsg.Text+="监听成功······\r\n ";
//设定最多十个排队连接请求
socketWatch.Listen(10);
//开启一个新线程
Thread thread =newThread(Listen);
thread.IsBackground=true;
thread.Start(socketWatch);
}
/// <summary>
/// 等待客户端连接,并且创建与之通信的Socket
/// </summary>
/// <param name="obj"></param>
voidListen(object obj)
{
Socket soketlisten = obj asSocket;
while(true)
{
//等待客户端连接,并创建一个负责通信的Socket
Socket socketSend = soketlisten.Accept();
ServerMsg.Text+="连接成功·······"+ socketSend.RemoteEndPoint.ToString()+"\r\n";
//开启一个新线程不停接收客户端发来的消息
Thread reciveThread =newThread(Recive);
reciveThread.IsBackground=true;
reciveThread.Start(socketSend);
}
}
/// <summary>
/// 服务器端不停接收客户端发来的消息
/// </summary>
/// <param name="obj"></param>
voidRecive(object obj)
{
//接收消息
ConnectionSocket= obj asSocket;
if(ConnectionSocket==null)
{
return;
}
while(true)
{
//接收客户端发来信息
byte[] buffer =newbyte[1024*1024*2];
//实际接收的有效字节数
int receiveIndex =ConnectionSocket.Receive(buffer);
//以实际接收有效字节数来判断客户端是否下线了
if(receiveIndex ==0)
{
break;
}
string str =Encoding.UTF8.GetString(buffer,0, buffer.Length);
ReceiveMsg.Text+= str +"\r\n";
}
}
/// <summary>
/// 服务端发送消息
/// </summary>
publicvoidServerSendMessage()
{
byte[] buffer =Encoding.UTF8.GetBytes(SendMessage.Text);
int connectionIndex =ConnectionSocket.Send(buffer);
}
}
}
二、客户端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 网络编程.SockteHandle
{
/// <summary>
/// 客户端
/// </summary>
publicclassClientHandle
{
/// <summary>
/// IP地址
/// </summary>
publicstaticstringConnectionIp{ get;set;}
/// <summary>
/// 端口号
/// </summary>
publicstaticstringPoint{ get;set;}
//发送消息
publicTextBoxSendMsg{ get;set;}
/// <summary>
/// 接收消息
/// </summary>
publicTextBoxReciveMsg{ get;set;}
/// <summary>
/// 客户端Socket对象
/// </summary>
publicSocket socketSend =null;
/// <summary>
/// 创建负责通信的Socket
/// </summary>
publicvoidCreateClientSocket()
{
socketSend =newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip =IPAddress.Parse(ConnectionIp);
IPEndPoint endPoint =newIPEndPoint(ip,Convert.ToInt32(Point));
socketSend.Connect(endPoint);
ReciveMsg.Text+="连接到服务器";
//创建一个线程来接收服务器端数据
Thread reciveThread =newThread(ReciveServerMessage);
reciveThread.IsBackground=true;
reciveThread.Start(socketSend);
}
/// <summary>
/// 接收服务端信息
/// </summary>
voidReciveServerMessage(object obj)
{
Socket reciveSocket = obj asSocket;
while(true)
{
byte[] buffer =newbyte[1024*1024*2];
int reciveIndex = reciveSocket.Receive(buffer);
if(reciveIndex ==0)
{
break;
}
ReciveMsg.Text+="\r\n"+Encoding.UTF8.GetString(buffer)+"\r\n";
}
}
/// <summary>
/// 发送消息
/// </summary>
publicvoidSendMessage()
{
byte[] buffer =Encoding.UTF8.GetBytes(SendMsg.Text);
int sendIndex = socketSend.Send(buffer);
}
}
}
C#中网络通信的更多相关文章
- RocketMq中网络通信之服务端
一,Broker服务端入口(NettyServer端) 首先RocketMq网络通信采用的Netty通信.服务端主要集中在Broker中.我们先看一下Broker的启动类BrokerStartup 显 ...
- Linux中网络通信中 使用的结构体
"+++++++++++++++++++++++++ Linux TCP/UDP通信中的结构体 +++++++++++++++++++++++++++++++++++++++" s ...
- java中网络通信 Scoket
在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通 ...
- Linux下UPnP sample分析
一.UPnP简介 UPnP(Universal Plug and Play)技术是一种屏蔽各种数字设备的硬件和操作系统的通信协议.它是一种数字网络中间件技术,建立在TCP/IP.HTTP协 ...
- python高级之网络编程
python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...
- android考试题
一.选择题 1. Math.round(11.5)等于多少( ). Math.round(-11.5) 等于多少( C ). A.11 ,-11 B.11 ,-12 C.12 ,-1 ...
- 第六篇:python高级之网络编程
python高级之网络编程 python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...
- ZooKeeper 03 - ZooKeeper集群的脑裂问题 (Split Brain问题)
目录 1 ZooKeeper的主从机制 2 什么是ZooKeeper的脑裂 2.1 脑裂现象的表现 2.2 为什么会出现脑裂 3 ZooKeeper如何解决"脑裂" 3.1 3种可 ...
- JAVA自学笔记26
JAVA自学笔记26 1.网络编程 1)用来实现网络互联的不同计算机上运行的程序可以进行数据交换 2)网络模型一般泛指 OSI:(Open System Interconnection)开放系统互联参 ...
随机推荐
- Ubuntu14.04引导菜单修复
原文链接:http://www.metsky.com/archives/636.html 独立分区下的Ubuntu引导菜单修复有点麻烦,执行挂载等命令时要小心检查,修复此类引导,首先需要确保当前系统和 ...
- Django之瀑布流
一. 小功能瀑布流的实现 1.完成效果图 2.代码部分 <1>models.py from django.db import models # Create your models her ...
- 树状数组求LIS
我真的是咸鱼啊 多少年前的基础了我竟然才弄明白,哭 用树状数组维护<=x的最上上升子序列的最大值即可啊Orz 我真的菜的一笔啊! #include <bits/stdc++.h> u ...
- [CodeForces]986A Fair
大意:给一张图,每个图上有一个数,问以每个点为源点,经过的点包含k种数字的最小距离. 显然跑最短路会T,但我们注意到边权一定.某次学校考试就是类似题,可以bfs做,复杂度O(n),每种货物做一次,复杂 ...
- strtotime的一个使用问题
我在开发过程中遇到这么这个问题,因为赶进度,没有记下来处理方案,在鸟哥的博客看到原理分析,很到位!平时开发中总是急着处理问题,没有深入分析和记录问题. 1.问题: 今天是2018-07-31 执行代码 ...
- maven tomcat 插件
在 pom.xml 中添加如下内容 <!-- 配置 tomcat 插件 --> <build> <plugins> <plugin> <group ...
- CF369E. ZS and The Birthday Paradox
/* cf369E. ZS and The Birthday Paradox http://codeforces.com/contest/711/problem/E 抽屉原理+快速幂+逆元+勒让德定理 ...
- yii 正则验证
required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...
- 在magento的eav模型中如何在更新记录时只在value表的原值上更新
1,一般情况下,当我们在调用getModel在load某条实体接着更新对应实体上的值是,都不会覆盖原来的实体value表上的值,而是保留原来的,并在value表上重新创建一条值记录,比如初始表如下: ...
- CF43A Football
CF43A Football 题意翻译 题目大意 两只足球队比赛,现给你进球情况,问哪支队伍赢了. 第一行一个整数nn (1\leq n\leq 1001≤n≤100 ),表示有nn 次进球,接下来n ...