Crazy Learning for Day 19
来源:互联网 发布:瞻博网络工厂 编辑:程序博客网 时间:2024/05/18 19:19
1、简易客户端和服务端的聊天
- 实现客户端和服务端的消息请求和收发
- 实现多台客户端的连接,消息的异步发送
- 实现客户端的正常退出和异常退出检测
服务器端
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace TCPServer{ class Program { static void Main(string[] args) { StartServerASync(); Console.ReadKey(); } //同步发送消息,只能一条一条发送,需要采用异步的方式,持续不断的收发消息 static void StartServerASync() { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse("192.168.0.124"); IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 88); serverSocket.Bind(ipEndPoint);//绑定ip和端口号 serverSocket.Listen(0);//开始监听端口号 //Socket clientSocket = serverSocket.Accept();//接收一个客户端连接 //为了实现和多个客户端的连接,接收客户端的连接也需要使用异步的方式 serverSocket.BeginAccept(AcceptCallBack, serverSocket); } static void AcceptCallBack(IAsyncResult ar) { Socket serverSocket = ar.AsyncState as Socket; Socket clientSocket = serverSocket.EndAccept(ar); string msg = "Hello Client! 你好..."; byte[] data = System.Text.Encoding.UTF8.GetBytes(msg); clientSocket.Send(data); clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket); serverSocket.BeginAccept(AcceptCallBack, serverSocket); } static byte[] dataBuffer = new byte[1024]; static void ReceiveCallBack(IAsyncResult ar) { Socket clientSocket = null; try { clientSocket = ar.AsyncState as Socket; int count = clientSocket.EndReceive(ar); if (count == 0) { clientSocket.Close(); return; } string msg = Encoding.UTF8.GetString(dataBuffer, 0, count); Console.WriteLine("从客户端接收到数据:" + msg); clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);//回调 } catch (Exception e) { Console.WriteLine(e); if (clientSocket != null) { clientSocket.Close(); } } } }}
客户端
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.Sockets;using System.Net;namespace TCPClient{ class Program { static void Main(string[] args) { Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.124"), 88)); //客户端接收消息,收发顺序与服务器端相反 byte[] data = new byte[1024]; int count = clientSocket.Receive(data);//Receive执行后才继续执行下面代码 string msg = Encoding.UTF8.GetString(data, 0, count); Console.Write(msg); while (true) { string s = Console.ReadLine(); //Console.Write(s); if (s == "exit") { clientSocket.Close();return; } clientSocket.Send(Encoding.UTF8.GetBytes(s)); } Console.ReadKey(); clientSocket.Close(); } }}
客户端和服务端之间数据的传输以数据包的形式,当短时间内每个包都很小的时候,会采用粘包的方式传输(合并再发送);当包太大的时候,会采用分包的方式进行传输。
阅读全文
0 0
- Crazy Learning for Day 19
- Crazy Learning for Day 4
- Crazy Learning for Day 5
- Crazy Learning for Day 6
- Crazy Learning for Day 7
- Crazy Learning for Day 10
- Crazy Learning for Day 12
- Crazy Learning for Day 13
- Crazy Learning for Day 14
- Crazy Learning for Day 15
- Crazy Learning for Day 16
- Crazy Learning for Day 17
- Crazy Learning for Day 18
- Crazy Learning for Day 20
- Unity Learning for Day 19
- Unity Learning for Day 2
- Unity Learning for Day 3
- Unity Learning for Day 5
- java中数组的定义及其基础应用
- android仿微信消息长按根据触摸位置弹出对话框
- 1032. Sharing (25)
- AJAX基础
- 170718 python3.x install PIL
- Crazy Learning for Day 19
- 一次关于ETCD客户端(ETCD4J)问题的定位
- 一分钟了解“c语言printf函数”
- TCP-IP学习笔记(三)——概述
- C语言32个关键字(分类)
- 正则ES5-6
- mysql触发器的一个小栗子
- 初学HTML
- n*n基础排序算法