使用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的更多相关文章

  1. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  2. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

  3. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  4. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  5. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  6. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  7. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  8. Socket编程实践(2) Socket API 与 简单例程

    在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...

  9. Socket编程实践(1) 基本概念

    1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...

随机推荐

  1. python以不同方式打印输出九九乘法表

    参考:http://www.cnblogs.com/suiy-160428/p/5594389.htmlpython输出 9*9 乘法口诀表 矩形输出九九乘法表: for i in range(1,1 ...

  2. Win10怎么添加开机启动项?Win10添加开机自动运行软件三种方法

    Win10管理开机启动项的方法相信大家已经非常熟悉,msconfig命令各系统都通用,那么很多用户发觉Win10和Win7 XP等系统不同,没有启动文件夹,那么我们怎么添加开机启动项呢?如晨软件或程序 ...

  3. sql简易教程

    讲干货,不啰嗦,本教程主要基于Mysql数据库,讲解sql的基本使用. 数据库主要包括增.删.改.查等基本操作,以下为设计到的常用的sql语句: 一.查 1.select 语法查询 SELECT co ...

  4. css3控制字体动态变换颜色

    css3控制字体动态变换颜色 <!doctype html> <html> <head> <meta charset="utf-8"> ...

  5. 使用 function 构造函数创建组件和使用 class 关键字创建组件

    使用 function 构造函数创建组件: 如果想要把组件放到页面中,可以把构造函数的名称,当作 组件的名称,以 HTML标签形式引入页面中, 因为在React中,构造函数就是一个最基本的组件. 注意 ...

  6. python初始化定长列表

    >>> lst = ['x' for n in range(5)] >>> print(lst) ['x', 'x', 'x', 'x', 'x'] >> ...

  7. JComboBox实现时间控件

    1.认识JComboBox控件 最近学习使用了JComboBox组件: 在学习使用了JList以及Jtree组件之后,对于使用JComboBox还是很轻松的. JcomboBox的其实也是由一个Mod ...

  8. FTP用户验证、访问设置以及log日志

    若要访问FTP站点开启了基本身份认证,访问服务器(ftp://服务器IP:端口号),需要输入正确的用户名及密码才可正常访问 当客户端通过浏览器访问时就需要验证,提示如下图: 1.当输入正确的用户名及密 ...

  9. 4. Scrapy框架

    Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...

  10. 注意条件表达式规范[JLS 15.25]

    /** * 猜猜输出结果是什么 */ public class appalet { public static void main(String[] args) { char x = 'x'; int ...