socket入门教程
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入门教程相关推荐
- socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)
socket 编程入门教程(三)TCP原理:5.TCP的三次握手(three-way handshake) 前面3个小节介绍了socket机制对TCP协议三次握手的实现,需要强调的是,与协议独立于实现 ...
- Android基础入门教程——7.6.1 Socket学习网络基础准备
Android基础入门教程--7.6.1 Socket学习网络基础准备 标签(空格分隔): Android基础入门教程 本节引言: 为了照顾没学过Java Socket的初学者,或者说捋一捋Andro ...
- Kafka入门教程与详解
1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...
- python爬虫入门教程--优雅的HTTP库requests(二)
requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...
- Netty入门教程——认识Netty
什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...
- 黑客渗透入门教程 第一课:粗暴的端口扫描
很多人想学黑客知识,却不知如何入门,网上的教程也太繁琐,小白看了也头疼,那还是我来写黑客系列入门教程吧,跟着我做,你能黑客入门的. 端口扫描是指发送一组扫描消息,了解其提供的计算机网络服务类型(这些网 ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...
- Linux大棚版redis入门教程
后端开发过程中,有时需要考虑系统的实时性,那么缓存系统就派上用场了,当然,现在最常用的当属Redis,这篇文章转自 Linux大棚版redis入门教程 [本教程目录] redis是什么 redis的作 ...
- 超强、超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...
最新文章
- 什么是SESSION?(一)
- python matplotlib 简单用法
- love2d--glsl03噪声
- Bootstrap4+MySQL前后端综合实训-Day02-PM【新闻管理后台(登录页面、首页)、#left>a:nth-child(4) {}】
- Struts2异常处理机制
- linux 创建路径函数,Linux函数库的创建方法(2)
- 形参与实参在函数中的传递
- scala 线性回归_Scala的特征线性化
- GCC:使用图对比编码的图神经网络预训练模型 KDD2020
- SAP License:SAP ECC6安装系列五:安装后 License 的处理
- ubuntu下rar文件解压后文件名乱码
- appendChild+insertBefore:创建和添加节点
- http server response 一览
- Java-如何防范CSRF攻击
- 【毕业设计】基于stm32的智能扫地机器人设计与实现 - 单片机 物联网
- [流行偶像]分析王菲唱腔的精辟文字(转载)
- html5动态效果随鼠标动,html5+CSS3心形动画跟随鼠标光标运动特效
- openfire 开发QQ群、微信群等固定群插件
- mac电脑有很多._开头的文件
- 「真香系列」新物种首发亮相 聚划算爆款孵化玩法升级
热门文章
- mfc对话框的二次切分
- java php net_网页快速入门(asp aps.net php java)
- python字符垂直输出型烟雾机_python+opencv实现水平投影和垂直投影
- 比较器Comparable(内部比较器)和Comparator(外部比较器)
- 015_html注释
- usb接口电路_RS232接口与RS485的不同之处
- 未来之路—写在大二结束之前
- Linux系统命令常用查询
- v-for中为什么要有key属性
- java获取小数位数_Java获取小数位数