我们这里利用Socket在模拟一个客户端与服务器通信,其实客户端与服务端通信就像人与人打电话一样,想要给一个人打电话,我们首先必须要有手机,必须知道对方的手机号码,这里Socket就好比一部手机,而短点就好比手机号,但是当你拨了电话,还需要对方接了以后才算是可以通信,下面我们来看一看代码:

首先写服务器端:

这里我们指定一个ip地址和端口号:然后开始对它进行监听;

  1. private void btnListen_Click(object sender, EventArgs e)
  2. {
  3. //ip地址
  4. IPAddress ip = IPAddress.Parse(this.txtServer.Text);
  5. //网络端口号
  6. IPEndPoint endpoint = new IPEndPoint(ip, int.Parse(txtPort.Text));
  7.  
  8. //负责监听的Socket
  9. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  10. //绑定本地短点
  11. try
  12. {
  13. socket.Bind(endpoint);//这里绑定一个端点
  14. socket.Listen();
  15. SetText("开始监听");
  16. btnListen.Enabled = false;
  17. }
  18. catch(Exception ex)
  19. {
  20. btnListen.Enabled = true;
  21. SetText(ex.Message);
  22. return;
  23. }
  24.  
  25. //创建线程,用来执行socket监听客户端,为什么要创建一个线程呢,因为这里我想多找一个人来干活,让它替主线程分担点任务
  26. Thread th = new Thread(Accept);
  27. th.IsBackground = true;//设置为后台线程
  28. th.Start(socket);
  29. }
  30.  
  31. Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
  32.  
  33. int n = ;//创建10个客户端的连接
  34. //接受客户端的连接,避免主线程陷入死循环
  35. void Accept(object o)
  36. {
  37. while (n>)
  38. {
  39. n--;
  40. //监听用的Socket
  41. Socket socket = o as Socket;
  42.  
  43. //当有客户端连接成功后,创建通信用的Socket
  44. Socket connSocket = socket.Accept();
  45.  
  46. //获取客户端ip和端口号
  47. string ip = connSocket.RemoteEndPoint.ToString();
  48. //把客用户端ip和通信用的Socket存放到字典中
  49. dic.Add(ip, connSocket);
  50. cmbIP.Items.Add(ip);
  51.  
  52. //提示连接成功
  53. SetText( ip+ "连接成功!");
  54. //服务端接受客户端发来的信息
  55. Thread th = new Thread(ReciveMsg);
  56. th.Start(connSocket);
  57. }
  58.  
  59. }

那么如果客户端接了电话,那么我们要接收客户端的发来的信息

  1. void ReciveMsg(object o)
  2. {
  3. Socket connSocket = o as Socket;//我们这个Socket是我们上面创建的用来连接通信的,与监听的Scoket区别开
  4. byte[] buffer = new byte[ * * ];//设置最多接收5兆的信息
  5. while (true)//这里我们循环接收客户端的信息,客户端可以一直发信息,我们创建线程的好处就在这里,因为主线程一旦陷入死循环,那么这个程序就卡了
  6. {
  7. int count = connSocket.Receive(buffer);//把接收到的信息放在buffer中
  8. if (count > )
  9. {
  10. string s = Encoding.UTF8.GetString(buffer, , count);
  11. SetText(connSocket.RemoteEndPoint.ToString() + ":" + s);
  12. }
  13. else
  14. {
  15. SetText(connSocket.RemoteEndPoint.ToString()+"断开连接");
  16. connSocket.Close();
  17. break;
  18. }
  19. }
  20. }
  1. /// <summary>
  2. /// 发送消息 开头标记为0
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void button3_Click(object sender, EventArgs e)
  7. {
  8. //判断下拉框是否有选项
  9. if (cmbIP.SelectedIndex >= )
  10. {
  11. string key = cmbIP.Text;
  12. byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);
  13. List<byte> list = new List<byte>();
  14. list.Add();
  15. list.AddRange(buffer);
  16. dic[key].Send(list.ToArray());
  17. }
  18. else
  19. {
  20. MessageBox.Show("请选择客户端用户!");
  21. }
  22. }
  1. /// <summary>
  2. /// 发送文件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void button2_Click(object sender, EventArgs e)
  7. {
  8. if (!string.IsNullOrEmpty(txtFilePath.Text))
  9. {
  10. if (cmbIP.SelectedIndex >= )
  11. {
  12. string key = cmbIP.Text;
  13. FileStream fs = new FileStream(txtFilePath.Text, FileMode.Open);
  14. byte[] buffer=new byte[fs.Length];
  15. fs.Read(buffer, , buffer.Length);
  16.  
  17. //文件 标记开头为1
  18. List<byte> list = new List<byte>();
  19. list.Add();
  20. list.AddRange(buffer);
  21.  
  22. dic[key].Send(list.ToArray());
  23. }
  24. else
  25. {
  26. MessageBox.Show("请选择客户端用户!");
  27. }
  28. }
  29. else
  30. {
  31. MessageBox.Show("请选择文件!");
  32. }
  33. }

先把服务器端的写一下。

Socket编程(一):建立与客户端的连接并接受数据的更多相关文章

  1. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  2. win32 socket编程(五)——客户端实例(TCP)

    一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...

  3. java socket编程 初级 服务器端和客户端 通信

    package server; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerS ...

  4. python 学习笔记_2 模拟socket编程 服务端、客户端通信(参考核心编程2代码实现)

    服务器端代码实现: #!/usr/bin/env python#coding=gbk'''接收客户端字符串,在字段串前面打上当前时间,然后返回server端采用 python2 linux下调试运行客 ...

  5. WINDOWS SOCKET编程中accept出来的新连接是阻塞还是非阻塞

    实践证明 SOCKET hNewSock=accept(hListenSock) 当hListenSock为阻塞模型时,hNewSock则为阻塞模型 否则 当hListenSock为非阻塞模型时,hN ...

  6. 利用socket编程在ESP32上搭建一个TCP客户端

    通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ...

  7. python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)

    1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...

  8. c#socket编程基础

    Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...

  9. C#的Socket编程

    Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...

随机推荐

  1. [吴恩达机器学习笔记]12支持向量机1从逻辑回归到SVM/SVM的损失函数

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.1 SVM损失函数 从逻辑回归到支持向量机 为了描述 ...

  2. Debian最完美安装flash的教程//适用于所有linux版本

    话说不管是新手还是老手,都离不开flash.没有flash的支持,菜鸟们也少了一些把玩linux的动力. flash有很多安装的方法,不过性能相差很大.这里的缘由就不重要了. 下面我介绍在chromi ...

  3. 1.java内存区域与内存溢出异常

    1.java运行时数据区如图所示: 2.每个区域的功能 (1)程序计数器(寄存器) 当前线程所执行的字节码的行号指示器 为了线程切换后能够恢复到正确的执行位置,因此每个线程拥有自己独立的程序计数器 如 ...

  4. 关于 Capella 需要纠正的语音

    li { font-size: 18px; } 关于 Capella 需要纠正的语音 持续更新 浊塞音声带要振动 区分 [θ]/[ð] 和 [t̪],注意舌位 [ɫ] 的舌位,切记不能圆唇 [æ] 的 ...

  5. easyui 更改dialog弹出的位置

    方法一: 在弹出dialog的时候不用$('#dialogDiv').dialog('open');打开.用$('#dialogDiv').window('open');打开.再用window的res ...

  6. web开发之Servlet 三

    昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动 ...

  7. bootstrap下laydate样式错乱问题

    查看发现bs使用了 * {box-sizing:border-box;}重置了盒子模型 那么我们再把它重置回来,在样式中加入以下代码 .laydate_box, .laydate_box * { bo ...

  8. 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT

    [题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...

  9. iphone6设置企业qq

    1.首先要确定foxmail的账户服务器信息,右上角-账户账户管理-服务器设置 2.iphone端:

  10. MYSQL的隐式类型转换

    官方文档中是这么说的 当操作者使用不同类型的操作数,操作数类型兼容的出现使 转换.一些 发生隐式转换.例如,MySQL会自动 将数字转换为字符串的必要,反之亦然. 也可以将数字转换为字符串明确 使用( ...