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【列表 字典 元组】
列表列表用中括号[ ]把各种数据框起来,每一个数据叫作“元素”.每个元素之间都要用英文逗号隔开各种类型的数据(整数/浮点数/字符串)————————————————————————————从列表提取单 ...
- html跑马灯/走马灯效果
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...
- Ubuntu 安装 QtCreator (version : Qt 5.9.8)
平台 :Ubuntu 16.04 QT :5.9.8 (open source) 首先去QT安装包下载安装包,为了保持与arm板子的统一,本人选择了 5.9.8 版本的QT 可 ...
- java7:核心技术与最佳实践读书笔记——字节代码格式
一般流程:开发人员写出java源代码(.java) -> javac(编译器) -> java字节代码(.class) -> 加载 -> java虚拟机(jvm)运行. 1. ...
- 使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云
背景信息 阿里云数据库 SQL Server 版导入数据有如下限制: 仅支持导入 SQL Server 2005.SQL Server 2008.SQL Server 2008R2 版本数据 仅支持全 ...
- git提交项目到码云
提交代码: git initgit remote add origin 远程仓库地址git pull --rebase origin mastergit add -Agit commit -m &qu ...
- JS中逗号运算符的用法
逗号运算符,它将先计算左边的参数,再计算右边的参数值.然后返回最右边参数的值. 原书举的例子不太好,无法解释上面那句话,这里另外提供一个: var a = 10, b = 20; function C ...
- SIP中From ,Contact, Via 和 Record-Route/Route
转载:http://eadgar.blogbus.com/logs/374635.html 注意:以下内容适用于SIP消息中,在具体的应用环境中,例如IMS,每个消息头都有其他独特的意义,但不会和以下 ...
- c# 将datatable中的数据保存到excel文件中
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...
- vue项目中图片预览旋转功能
最近项目中需要在图片预览时,可以旋转图片预览,在网上找了下,发现有一款功能强大的图片组件:viewerjs. git-hup: https://github.com/fengyuanchen/view ...