Socket编程(一):建立与客户端的连接并接受数据
我们这里利用Socket在模拟一个客户端与服务器通信,其实客户端与服务端通信就像人与人打电话一样,想要给一个人打电话,我们首先必须要有手机,必须知道对方的手机号码,这里Socket就好比一部手机,而短点就好比手机号,但是当你拨了电话,还需要对方接了以后才算是可以通信,下面我们来看一看代码:
首先写服务器端:
这里我们指定一个ip地址和端口号:然后开始对它进行监听;
private void btnListen_Click(object sender, EventArgs e)
{
//ip地址
IPAddress ip = IPAddress.Parse(this.txtServer.Text);
//网络端口号
IPEndPoint endpoint = new IPEndPoint(ip, int.Parse(txtPort.Text)); //负责监听的Socket
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定本地短点
try
{
socket.Bind(endpoint);//这里绑定一个端点
socket.Listen();
SetText("开始监听");
btnListen.Enabled = false;
}
catch(Exception ex)
{
btnListen.Enabled = true;
SetText(ex.Message);
return;
} //创建线程,用来执行socket监听客户端,为什么要创建一个线程呢,因为这里我想多找一个人来干活,让它替主线程分担点任务
Thread th = new Thread(Accept);
th.IsBackground = true;//设置为后台线程
th.Start(socket);
} Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); int n = ;//创建10个客户端的连接
//接受客户端的连接,避免主线程陷入死循环
void Accept(object o)
{
while (n>)
{
n--;
//监听用的Socket
Socket socket = o as Socket; //当有客户端连接成功后,创建通信用的Socket
Socket connSocket = socket.Accept(); //获取客户端ip和端口号
string ip = connSocket.RemoteEndPoint.ToString();
//把客用户端ip和通信用的Socket存放到字典中
dic.Add(ip, connSocket);
cmbIP.Items.Add(ip); //提示连接成功
SetText( ip+ "连接成功!");
//服务端接受客户端发来的信息
Thread th = new Thread(ReciveMsg);
th.Start(connSocket);
} }
那么如果客户端接了电话,那么我们要接收客户端的发来的信息
void ReciveMsg(object o)
{
Socket connSocket = o as Socket;//我们这个Socket是我们上面创建的用来连接通信的,与监听的Scoket区别开
byte[] buffer = new byte[ * * ];//设置最多接收5兆的信息
while (true)//这里我们循环接收客户端的信息,客户端可以一直发信息,我们创建线程的好处就在这里,因为主线程一旦陷入死循环,那么这个程序就卡了
{
int count = connSocket.Receive(buffer);//把接收到的信息放在buffer中
if (count > )
{
string s = Encoding.UTF8.GetString(buffer, , count);
SetText(connSocket.RemoteEndPoint.ToString() + ":" + s);
}
else
{
SetText(connSocket.RemoteEndPoint.ToString()+"断开连接");
connSocket.Close();
break;
}
}
}
/// <summary>
/// 发送消息 开头标记为0
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
//判断下拉框是否有选项
if (cmbIP.SelectedIndex >= )
{
string key = cmbIP.Text;
byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);
List<byte> list = new List<byte>();
list.Add();
list.AddRange(buffer);
dic[key].Send(list.ToArray());
}
else
{
MessageBox.Show("请选择客户端用户!");
}
}
/// <summary>
/// 发送文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtFilePath.Text))
{
if (cmbIP.SelectedIndex >= )
{
string key = cmbIP.Text;
FileStream fs = new FileStream(txtFilePath.Text, FileMode.Open);
byte[] buffer=new byte[fs.Length];
fs.Read(buffer, , buffer.Length); //文件 标记开头为1
List<byte> list = new List<byte>();
list.Add();
list.AddRange(buffer); dic[key].Send(list.ToArray());
}
else
{
MessageBox.Show("请选择客户端用户!");
}
}
else
{
MessageBox.Show("请选择文件!");
}
}
先把服务器端的写一下。
Socket编程(一):建立与客户端的连接并接受数据的更多相关文章
- Java Socket编程如何建立两者关系
转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...
- win32 socket编程(五)——客户端实例(TCP)
一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...
- java socket编程 初级 服务器端和客户端 通信
package server; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerS ...
- python 学习笔记_2 模拟socket编程 服务端、客户端通信(参考核心编程2代码实现)
服务器端代码实现: #!/usr/bin/env python#coding=gbk'''接收客户端字符串,在字段串前面打上当前时间,然后返回server端采用 python2 linux下调试运行客 ...
- WINDOWS SOCKET编程中accept出来的新连接是阻塞还是非阻塞
实践证明 SOCKET hNewSock=accept(hListenSock) 当hListenSock为阻塞模型时,hNewSock则为阻塞模型 否则 当hListenSock为非阻塞模型时,hN ...
- 利用socket编程在ESP32上搭建一个TCP客户端
通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ...
- python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...
- c#socket编程基础
Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...
- C#的Socket编程
Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...
随机推荐
- php网摘收藏
1.thinkphp3.2.3开发手册: http://document.thinkphp.cn/manual_3_2.html 2.ThinkPHP3.2.3的函数汇总:http://www.thi ...
- Elasticsearch.Net搜索引擎初使用【客户端安装】
下载windows客户端 官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/net-api/6.x/introduction.ht ...
- mysql \G
mysql 命令区分大小写.ego (\G) Send command to mysql server, display result vertically. go (\g) ...
- 莫队 Codeforces Round #340 (Div. 2) E
题目大意:给你一个长度为n的序列,有m个询问,每次询问一个区间[L,R],表示这个区间内,有多少的a[i]^a[i+1].....^a[j]=k. 思路:莫队去搞就好了 我们定义pre[i]=a[1] ...
- stat命令--文件权限属性设置
stat命令文件权限属性设置 stat命令用于显示文件的状态信息. stat命令的输出信息比ls命令的输出信息要更详细. 语法 stat(选项)(参数) 选项 -L:支持符号连接: -f:显示文件系统 ...
- Linux系统中各目录的作用
/binbin是binary的缩写.这个目录沿袭了UNIX系统的结构,存放着使用者最经常使用的命令.例如cp.ls.cat,等等. /boot这里存放的是启动Linux时使用的一些核心文件. /dev ...
- 编程笔记:JavaScript 中的类型检查
在Badoo的时候我们写了大量的JS脚本,光是在我们的移动web客户端上面就有大概60000行,可想而知,维护这么多JS可是相当具有挑战性的.在写如上规模js脚本客户端应用的时候我们必须对一件事保持警 ...
- 【洛谷 P2604】 [ZJOI2010]网络扩容(最大流,费用流)
题目链接 第一问就是简单的最大流. 第二问,保留第一问求完最大流的残量网络. 然后新建一个源点,向原源点连一条流量为k,费用为0的边. 然后所有边重新连一起(原来的边保留),费用为题目所给,最小费用即 ...
- 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
题目链接 易得第\(i\)关的最小攻击力为\(\max_{j=1}^i\frac{sum[i]-sum[j-1]}{x+d*(i-j)}\) 十分像一个斜率式,于是看作一个点\(P(x+d*i,sum ...
- Sublime text 3中文汉化教程
想弄个中文版的sublime,居然可以不用重新下载汉化包或者重新下载简体中文版了~而是只需要安装个插件即可! 工具/原料 电脑 sublime text3编辑器 方法/步骤 启动并进入s ...