Server.cs   服务端程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;namespace SocketTest
{public partial class Server : Form{Thread serverThread; //服务端线程Thread clientThread; //客户端线程Socket serverSocket; //服务端socketSocket clientSocket; //客户端socketpublic Server(){InitializeComponent();}private void ServerStart(){//创建IPEndPoint实例IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 6001);//创建一个套接字serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将所创建的套接字与IPEndPoint绑定
            serverSocket.Bind(ipep);//设置套接字为收听模式serverSocket.Listen(10);/*** 通过serverSocket.Accept()来接收客户Socket的连接请求,* 在这里用循环可以实现该线程实时侦听,而不是只侦听一次。* 当程序运行serverSocket.Accept()时,会等待,直到有客户端Socket发起连接请求时,* 获取该客户Socket,如上面的clientSocket。在这里我用多线程来实现与多个客户端Socket的连接和通信,* 一旦接收到一个连接后,就新建一个线程,执行ReceiveData功能来实现信息的发送和接收。*/while (true){try{//在套接字上接收接入的连接clientSocket = serverSocket.Accept();clientThread = new Thread(new ThreadStart(ReceiveData));clientThread.Start();}catch (Exception ex){MessageBox.Show("listening Error: " + ex.Message);}}}/*** 通过IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;* 我们可以获取连接上的远程主机的端口和IP地址,如果想查询该主机的其它属性如主机名等,* 可用于上一篇讲的Dns.GetHostByAddress(string ipAddress)来返回一个IPHostEntry对象,就可以得到。* 另外我们要注意的是,通过Socket发送信息,必须要先把发送的信息转化成二进字进行传输,* 收到信息后也要把收到的二进字信息转化成字符形式,* 这里可以通过Encoding.ASCII.GetBytes(welcome);和Encoding.ASCII.GetString(buffer).Substring(0, bufLen);来实现。* 以上就是服务端Socket侦听模式的实现,只要有远程客户端Socket连接上后,就可以轻松的发送信息和接收信息了。* 下面我们来看看客户端Socket是怎么连接上服务器的。**/private void ReceiveData(){bool keepalive = true;Socket s = clientSocket;Byte[] buffer = new Byte[1024];//根据收听到的客户端套接字向客户端发送信息IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;this.Invoke(new MethodInvoker(() =>{lstServer.Items.Add("Client:" + clientep.Address + "(" + clientep.Port + ")");}));string welcome = "Welcome to my test sever ";byte[] data = new byte[1024];data = Encoding.ASCII.GetBytes(welcome);s.Send(data, data.Length, SocketFlags.None);while (keepalive){//在套接字上接收客户端发送的信息int bufLen = 0;try{bufLen = s.Available;s.Receive(buffer, 0, bufLen, SocketFlags.None);if (bufLen == 0)continue;}catch (Exception ex){MessageBox.Show("Receive Error:" + ex.Message);return;}clientep = (IPEndPoint)s.RemoteEndPoint;string clientcommand = System.Text.Encoding.ASCII.GetString(buffer).Substring(0, bufLen);this.Invoke(new MethodInvoker(() =>{lstServer.Items.Add(clientcommand + "(" + clientep.Address + ":" + clientep.Port + ")");}));}}private void btnOpen_Click(object sender, EventArgs e){serverThread = new Thread(new ThreadStart(ServerStart));serverThread.Start();lstServer.Items.Add("Server Start .....");}}
}

Client.cs(客户端程序)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace Client
{public partial class Client : Form{Socket clientSocket;Thread clientThread;public Client(){InitializeComponent();}/*** 客户端Socket连接相对来说比较简单了,另外说明一下,在执行客户端连接前,服务端Socket侦听必须先启动,* 不然会提示服务器拒绝连接的信息。* 客户端的发送信息和接收信息跟服务器的接收发送是一样的,只不过一个是侦听模式而另一个是连接模式。* 另外提一下,这里服务端开启侦听服务、客户端连接服务端都采用线程方式来实现,这样服务端能够跟多个客户端同时通信,不用等候,* 当然还有另外一种方式可以实现那就是异步socket.*/private void ConnectToServer(){byte[] data = new byte[1024];//创建一个套接字IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001);clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//将套接字与远程服务器地址相连try{clientSocket.Connect(ipep);}catch (SocketException ex){MessageBox.Show("connect error: " + ex.Message);return;}while (true){//接收服务器信息int bufLen = 0;try{bufLen = clientSocket.Available;clientSocket.Receive(data, 0, bufLen, SocketFlags.None);if (bufLen == 0){continue;}}catch (Exception ex){MessageBox.Show("Receive Error:" + ex.Message);return;}string clientcommand = System.Text.Encoding.ASCII.GetString(data).Substring(0, bufLen);this.Invoke(new MethodInvoker(() =>{lstClient.Items.Add(clientcommand);}));//clientSocket.Shutdown(SocketShutdown.Both);//clientSocket.Close();
            }}private void button1_Click(object sender, EventArgs e){clientThread = new Thread(new ThreadStart(ConnectToServer));clientThread.Start();}private void btnSend_Click(object sender, EventArgs e){//向服务器发送信息byte[] data = new byte[1024];data = Encoding.ASCII.GetBytes(txtClient.Text);clientSocket.Send(data, data.Length, SocketFlags.None);}}
}

转载于:https://www.cnblogs.com/systemnet123/p/3237833.html

socket入门教程相关推荐

  1. socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)

    socket 编程入门教程(三)TCP原理:5.TCP的三次握手(three-way handshake) 前面3个小节介绍了socket机制对TCP协议三次握手的实现,需要强调的是,与协议独立于实现 ...

  2. Android基础入门教程——7.6.1 Socket学习网络基础准备

    Android基础入门教程--7.6.1 Socket学习网络基础准备 标签(空格分隔): Android基础入门教程 本节引言: 为了照顾没学过Java Socket的初学者,或者说捋一捋Andro ...

  3. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  4. python爬虫入门教程--优雅的HTTP库requests(二)

    requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...

  5. Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...

  6. 黑客渗透入门教程 第一课:粗暴的端口扫描

    很多人想学黑客知识,却不知如何入门,网上的教程也太繁琐,小白看了也头疼,那还是我来写黑客系列入门教程吧,跟着我做,你能黑客入门的. 端口扫描是指发送一组扫描消息,了解其提供的计算机网络服务类型(这些网 ...

  7. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

  8. Linux大棚版redis入门教程

    后端开发过程中,有时需要考虑系统的实时性,那么缓存系统就派上用场了,当然,现在最常用的当属Redis,这篇文章转自 Linux大棚版redis入门教程 [本教程目录] redis是什么 redis的作 ...

  9. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

最新文章

  1. 什么是SESSION?(一)
  2. python matplotlib 简单用法
  3. love2d--glsl03噪声
  4. Bootstrap4+MySQL前后端综合实训-Day02-PM【新闻管理后台(登录页面、首页)、#left>a:nth-child(4) {}】
  5. Struts2异常处理机制
  6. linux 创建路径函数,Linux函数库的创建方法(2)
  7. 形参与实参在函数中的传递
  8. scala 线性回归_Scala的特征线性化
  9. GCC:使用图对比编码的图神经网络预训练模型 KDD2020
  10. SAP License:SAP ECC6安装系列五:安装后 License 的处理
  11. ubuntu下rar文件解压后文件名乱码
  12. appendChild+insertBefore:创建和添加节点
  13. http server response 一览
  14. Java-如何防范CSRF攻击
  15. 【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网
  16. [流行偶像]分析王菲唱腔的精辟文字(转载)
  17. html5动态效果随鼠标动,html5+CSS3心形动画跟随鼠标光标运动特效
  18. openfire 开发QQ群、微信群等固定群插件
  19. mac电脑有很多._开头的文件
  20. 「真香系列」新物种首发亮相 聚划算爆款孵化玩法升级

热门文章

  1. mfc对话框的二次切分
  2. java php net_网页快速入门(asp aps.net php java)
  3. python字符垂直输出型烟雾机_python+opencv实现水平投影和垂直投影
  4. 比较器Comparable(内部比较器)和Comparator(外部比较器)
  5. 015_html注释
  6. usb接口电路_RS232接口与RS485的不同之处
  7. 未来之路—写在大二结束之前
  8. Linux系统命令常用查询
  9. v-for中为什么要有key属性
  10. java获取小数位数_Java获取小数位数