C# Socket 编程 Sample
使用Socket通信的服务器端编程,熟悉了服务器端和客户端的通信流程,实现了收发信息、文件传送以及震动功能
服务器端先创建Socket,然后将其和本地ip地址以及端口号连接,也就是使用Bind方法,然后使用Listen方法监听。
用Accept方法接受客户端的连接申请,并且等待客户端连接(在winform中,由于Accept方法是阻塞方法,必须创建一个线程来执行,防止主窗体卡死)
客户端连接成功Accept方法会返回一个用于发送和接收消息的Socket,之后就要用这个socket进行通信
在通信过程中要像实现不同功能,比如传送文件,就要在发送的字节流中使用一定的位置来存储信息,也就是使用自己的协议,在这个案例中,取第一个字节标识信息,0代表发送信息,1代表传递文件,2代表震动窗体
服务端代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO; namespace ServerReview
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Socket socketSend;
private Socket socketWatch;
private Dictionary<string, Socket> socketClientList = new Dictionary<string, Socket>();
private void btnStart_Click(object sender, EventArgs e)
{
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint iep = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//将套接字和本机地址绑定
socketWatch.Bind(iep);
ShowMsg("监听成功");
//用Listen监听
socketWatch.Listen();
//创建新线程不停接受客户端请求
Thread thread = new Thread(ServerAccept);
thread.IsBackground = true;
thread.Start();
}
private void ServerAccept()
{
while (true)
{
socketSend = socketWatch.Accept();
socketClientList.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMsg(socketSend.RemoteEndPoint.ToString() + "连接成功");
//开启新线程不停接收消息
Thread thread = new Thread(ServerReceive);
thread.IsBackground = true;
thread.Start();
}
}
private void ServerReceive()
{
while (true)
{
try
{
byte[] buffer = new byte[ * * ];
int byteNum = socketSend.Receive(buffer);
if (byteNum == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , byteNum);
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
}
catch { }
}
}
private void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
} private void btnSend_Click(object sender, EventArgs e)
{
string str = txtMsg.Text;
List<byte> list = new List<byte>();
list.Add();
byte[] buffer = Encoding.UTF8.GetBytes(str);
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
string ip = cboUsers.SelectedItem.ToString();
socketClientList[ip].Send(newBuffer);
} private void btnSelectFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"D:\";
ofd.Title = "请选择要发送的文件";
ofd.Filter = "所有文件|*.*";
ofd.ShowDialog();
txtFilePath.Text = ofd.FileName;
} private void btnSendFile_Click(object sender, EventArgs e)
{
string path = txtFilePath.Text;
using(FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read))
{
try
{
byte[] buffer = new byte[ * * ];
int l = fsRead.Read(buffer, , buffer.Length);
List<byte> list = new List<byte>();
list.Add();
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
socketClientList[cboUsers.SelectedItem.ToString()].Send(newBuffer,,l+,SocketFlags.None);
}
catch { }
}
} private void btnShake_Click(object sender, EventArgs e)
{
byte[] buffer = new byte[];
buffer[] = ;
socketClientList[cboUsers.SelectedItem.ToString()].Send(buffer);
}
}
}
客户端代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
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 ClientRevier
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
private Socket socketClient;
private void btnStart_Click(object sender, EventArgs e)
{
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtServer.Text);
IPEndPoint iep = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
socketClient.Connect(iep);
ShowMsg("连接成功");
//因为要不停接受消息,所以用while循环,并且为了接受消息的同时能做其他事,把这个放到线程中执行
Thread thread = new Thread(ClientRecieve);
thread.IsBackground = true;
thread.Start();
}
private void ClientRecieve()
{
while (true)
{
byte[] buffer = new byte[ * * ];
int byteNum = socketClient.Receive(buffer);
if (byteNum == )
{
break;
}
switch (buffer[])
{
case :
string str = Encoding.UTF8.GetString(buffer, , byteNum-);
ShowMsg(socketClient.RemoteEndPoint + ":" + str);
break;
case :
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = @"D\";
sfd.Title = "请选择需要保存的路径";
sfd.Filter = "文本文件|*.txt|图片文件|*.jpg|所有文件|*.*";
sfd.ShowDialog(this);
using(FileStream fsWrite = new FileStream(sfd.FileName, FileMode.OpenOrCreate, FileAccess.Write))
{
fsWrite.Write(buffer, , byteNum - );
MessageBox.Show("保存成功");
}
break;
case :
for(int i = ; i < ; i++)
{
this.Location = new Point(, );
this.Location = new Point(, );
}
break;
default:break;
} }
}
private void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");
} private void btnSend_Click(object sender, EventArgs e)
{
string str = txtMsg.Text;
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketClient.Send(buffer); }
}
}
C# Socket 编程 Sample的更多相关文章
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Socket编程实践(2) Socket API 与 简单例程
在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...
- Socket编程实践(1) 基本概念
1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...
随机推荐
- python 基础例子 双色球 查询天气 查询电话
# 随机生成双色球import random# 随机数 1-16之间# r = random.randint(1,16)# print(r)phone_numbers_str = "匪警[1 ...
- Grace模式、Saint模式
一.probe(后端探针) 探测后端,确定他们是否健康,返回的状态用req.backend.healthy核对 backend b1 { .host = "127.0.0.1"; ...
- 阿里云 负载均衡 HTTP转HTTPS
一.相关文档 1.证书服务 2.简单路由-HTTP 协议变为 HTTPS 协议 二.阿里云操作界面 1.云盾证书服务管理控制台(查询CA证书服务) 2.负载均衡管理控制台 三.相关文档 1.Syman ...
- Attribute自定义特性+Asp.net MVC中的filter详解
转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...
- iOS 定义多个参数函数的写法
多个参数的写法 (方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ; 如 : 有三个参数 -(void)getdetailI ...
- vuex数据传递的流程
当组件修改数据的时候必须通过store.dispacth来调用actions中的方法. 当actions中的方法被触发的时候通过调用commit的方法来触发mutations里面的方法 mutatio ...
- elmentUI为table中的单元格添加事件
<el-main> <el-tabs v-model="curTab" type="card"> <!-- tab签 --> ...
- Java秒杀实战 (四)JMeter压测
转自:https://blog.csdn.net/qq_41305266/article/details/81071278. 一.JMeter入门 下载链接 http://jmeter.apache. ...
- asp.net网站部署在云服务器windows server 2008上
搭建一个网站需要以下4个准备: 1.域名解析 2.(云)服务器 3.数据库 4.网站代码 其中1可以可以去DNSPOD申请,同时需要进行备案,在上面就都可以完成.2用的是阿里云服务器windows s ...
- 第一章、接口规范之Restful规范
阅读目录 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源 2.5 资源操作由请求方式决定 3.1 正常响应 3.2 重定向响应 3.3 客户端异常 3.4 ...