一、创建服务端
二、创建客户端
三、连接测试
一 、TCp创建服务端
打开VS,新建工程 TalkText
新建一个类TalkSever.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
//首先创建Tcplistener,然后创建客户端,这个客户端是等到Tcplistener已经连接上客户端之后返回的客户端,这样的话连接上就可以通信了
//然后就是通信的过程,首先服务端输出一句话让客户端输入昵称,然后接收到了客户端发来的信息,在While循环中不停的交换信息,发送接收消息每次结束之后就要清空一下字节数组
namespace TalkingText
{
public class TalkSever
{
private TcpListener server;//作为服务器端
private TcpClient client;//客户端
private string name;
private string sendName;
private IPAddress addre = IPAddress.Parse("127.0.0.1");//以本机作为服务器端与客户端
private int port = 5566;
private NetworkStream stream;
byte[] receiceByte=new byte[256];
private string welcome = "你好,我是{0},我们可以通话了";
public void Start()
{
Console.WriteLine("请输入您的昵称:");//聊天系统一开始有一个打招呼的过程
name= Console.ReadLine();//接收返回的字符串
sendName = name + ":";
#region MyRegion 连接客户端
server=new TcpListener(addre,port);//创建Listener
server.Start();//启动服务器
client = server.AcceptTcpClient();//等待服务器连接,服务器连接上客户端会返回客户端的一个Client,
//用client接收,因为一会儿发送信息的时候要用到它
#endregion
#region MyRegion 要想相互通信需要获取通信流
stream = client.GetStream();
Talk();
#endregion
}
//通话方法
public void Talk()
{
welcome = string.Format(welcome, name);
stream.Write(Getbytes(welcome), 0, Getbytes(welcome).Length); //设置好欢迎语开始写入数据流中
//打好招呼之后就开始对话了,对话是随时实时互动,就让字节流随时保持开放状态,While循环一直读取和发送
while (true)
{
int length; //定义收到客户端的信息的长度,因为要判断数据流当中是否有这些数据,根据长度判断
while ((length = stream.Read(receiceByte, 0, receiceByte.Length)) > 0
) //stream.Read()读取的数据会存在于字节数组receiceByte当中
{
#region MyRegion 接收消息
string receiveStr = GetString(receiceByte);
//因为是以字节流的形式传送,可能字符串中会有\0字符串,所以替换掉
receiveStr = receiveStr.Replace("\0", "");
Console.WriteLine(receiveStr); //打印获取到的信息
#endregion
#region MyRegion 发送消息
//下面给客户端发送信息
string strSend = "";
while (strSend == "")
{
Console.Write("input>"); //提醒在这个后面进行输入
strSend = Console.ReadLine(); //当发送消息为空就等待输入
}
if (strSend == "exit") //退出循环,关闭Client
{
client.Close();
break;
}
else //发送消息
{
stream.Write(Getbytes(sendName + strSend), 0, Getbytes(sendName + strSend).Length);
}
#endregion
//因为每发送一次或接收一次,缓冲池中就会有新的数据,为防止数据一直增加溢出字节组,所以每接收一次读取完成之后要清除字节数组当中的数据,然后等待下一次接收,否则所有数据就会连接起来
Array.Clear(receiceByte, 0, receiceByte.Length);
}
break; //一次循环结束,Break
}
//关闭服务器
server.Stop();
}
//字节流转换为字符串
public string GetString(byte[] bytes)
{
return Encoding.UTF8.GetString(bytes);
}
//字符串转换为字节流
public byte[] Getbytes(string contentstring)
{
return Encoding.UTF8.GetBytes(contentstring);
}
}
}
Main函数中调用,运行项目就会启动方法
二、创建客户端,让客户端去连接服务器。同理打开VS新建工程 TalkClient
新建一个类:Client.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TalkClient
{
public class Client
{
//客户端类似于服务端
private TcpClient client;//客户端
private string name;//昵称
private string SendMsg;//发送的消息
private int port = 5566;//端口号
private NetworkStream stream;//数据流
byte[] receiceByte=new byte[256];//缓冲的字节数组
//建立与服务端的连接
public void Start()
{
Console.WriteLine("请输入您的昵称");//开始时输出一句话
//等待用户输入
name = Console.ReadLine();
SendMsg = name + ":";//进行通话的时候表明是谁说的
client =new TcpClient("127.0.0.1",port);//创建客户端
//连接上服务端之后就可以获取数据流了
stream = client.GetStream();
int length = 0;
//定义length判断stream中是否有数据流,不等于0说明有数据
while ((length=stream.Read(receiceByte,0,receiceByte.Length))!=0)//获取到的数据存在在缓冲区的字节数组receiceByte中
{
#region MyRegion 接收消息
string receiveStr = GetString(receiceByte);//接收的字节流转换为字符串
//因为是以字节流的形式传送,可能字符串中会有\0字符串,所以替换掉
receiveStr = receiveStr.Replace("\0", "");
Console.WriteLine(receiveStr); //打印获取到的信息
#endregion
#region MyRegion 发送消息
//下面给服务端发送信息
string strSend = "";
while (strSend == "")
{
Console.Write("input>"); //提醒在这个后面进行输入
strSend = Console.ReadLine(); //当发送消息为空就等待输入
}
if (strSend == "exit") //退出循环,关闭Client
{
client.Close();
break;
}
else //发送消息
{
stream.Write(Getbytes(SendMsg + strSend), 0, Getbytes(SendMsg + strSend).Length);
}
#endregion
//因为每发送一次或接收一次,缓冲池中就会有新的数据,为防止数据一直增加溢出字节组,所以每接收一次读取完成之后要清除字节数组当中的数据,然后等待下一次接收,否则所有数据就会连接起来
Array.Clear(receiceByte, 0, receiceByte.Length);
}
}
//字节流转换为字符串
public string GetString(byte[] bytes)
{
return Encoding.UTF8.GetString(bytes);
}
//字符串转换为字节流
public byte[] Getbytes(string contentstring)
{
return Encoding.UTF8.GetBytes(contentstring);
}
}
}
Main函数中调用,运行项目就会启动方法
三、连接测试
先运行服务端,在运行客户端,结果如下
这样简易版的聊天系统就做好了。