C#网络通信系列学习笔记
- 第一章、C#最简单的控制台网络通信&C#最简单的控制台socket通信
- 第二章、C#控制台实现一对一聊天&C#socket类的简单封装
- 第三章、C#简单界面在线聊天室(使用TCP转发实现的多人在线聊天室)
第二章、C#控制台实现一对一聊天
前言
在上一章中,我们只实现了最简单的socket通信,只有单次收发过程,在这一篇文章中,将会通过对Socket简单封装实现控制台的多发多收通信
一、socket简单封装
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ConsoleTest
{
class SocketTest
{
private Socket MySocket;
//开启一个线程循环执行接收方法来实时接收数据
private Thread ReceiveThread;
//用于客户端连接服务端
public bool Connect(IPAddress iP, int port)
{
try
{
MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(iP, port);
MySocket.Connect(endPoint);
return true;
}
catch
{
return false;
}
}
//用于服务端监听
public void Listen(IPAddress ip, int port)
{
Socket socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(ip, port);
socketwatch.Bind(endPoint);
socketwatch.Listen(1);//开始监听,参数表示最大允许几台主机连接我
Console.WriteLine("开始监听 端口号:" + port);
MySocket = socketwatch.Accept();//如果有客户端连接,就会返回这个客户端的sockeet对象
}
public bool Send(string str)
{
try
{
byte[] arrsendmsg = Encoding.UTF8.GetBytes(str);
if (MySocket.Send(arrsendmsg) != arrsendmsg.Length)
return false;
return true;
}
catch
{
return false;
}
}
public void recmsg()
{
while (true)
{
try
{
byte[] arrserverrecmsg = new byte[1024];
int length = MySocket.Receive(arrserverrecmsg);
if (length > 0)
{
Console.WriteLine("对方:" + Encoding.UTF8.GetString(arrserverrecmsg, 0, length));
}
}
catch
{
Console.WriteLine("对方连接已断开");
return;
}
Thread.Sleep(200);
}
}
public void StartReceive()
{
ReceiveThread = new Thread(recmsg);
ReceiveThread.Start();
}
public void ColseSocket()
{
//如果接收线程正在执行那么先关闭线程在关闭socket
if (ReceiveThread.ThreadState == ThreadState.Running)
ReceiveThread.Abort();
MySocket.Close();
}
}
}
二、使用步骤
1.客户端
代码如下(示例):
using System;
using System.Net;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
SocketTest mySocket = new SocketTest();
if (!mySocket.Connect(IPAddress.Parse("127.0.0.1"), 20000))
{
Console.WriteLine("网络连接失败");
return;
}
mySocket.StartReceive();
string myMsg;
while ((myMsg = Console.ReadLine()) != "exit")
{
mySocket.Send(myMsg);
}
mySocket.ColseSocket();
}
}
}
2.服务端
代码如下(示例):
using System;
using System.Net;
namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
SocketTest socketTest = new SocketTest();
socketTest.Listen(IPAddress.Any, 20000);
Console.WriteLine("有客户端连接了,开始聊天吧");
socketTest.StartReceive();
string myMsg;
while ((myMsg = Console.ReadLine()) != "exit")
{
socketTest.Send(myMsg);
}
socketTest.ColseSocket();
}
}
}
三、演示
小提示:输入exit是会直接退出的哦!
总结
以上就是今天分享的内容,这篇文章通过对socket进行了简单的封装实现了客户端和服务端都可以同时使用并且支持多发多收。
只是有一个小缺点,当你正在打字的时候,对方突然给你发一条消息,那么你打字的这一行后面就会追加上对方的消息哦,不过这样并不影响发送,只是显得不太优雅。
在下一篇文章中,将会继续在这一篇代码的基础上修改,实现一个简单的界面聊天室,让多个人参与到聊天当中!