首先编写服务端控制台程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace TCPserver
{
class Server
{
static void Main(string[] args)
{
int recv;
//缓存流入流出的消息
byte[] data = new byte[1024];
//该服务器可接收可配置在系统中任何网络接口上的接入连接请求
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//套接字与ip,端口绑定
newsock.Bind(ipep);
//套接字收听接入连接
newsock.Listen(10);
Console.WriteLine("waiting for a client...");
//接收来自客户机的接入连接尝试,
//返回一个新的套接字,在于客户机的通信中使用这个新的套接字
Socket client = newsock.Accept();//同步方法
//客户机的ip和端口信息
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("connected with {0} at port {1}", clientep.Address, clientep.Port);
string welcom = "welcom to my test server";
data = Encoding.ASCII.GetBytes(welcom);
//发出欢迎信息
client.Send(data, data.Length, SocketFlags.None);
//循环等待来自客户端的信息
while (true)
{
//Recive在使用buffer的同时,重新设置了buffer的大小,因此重新设置为原大小
data = new byte[1024];
recv = client.Receive(data);//同步方法
if (recv == 0)
{
break;//客户端退出则服务器端退出
}
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
client.Send(data, recv, SocketFlags.None);//发出应答信息
}
Console.WriteLine("disconnected from {0}", clientep.Address);
client.Close();//关闭客户机套接字
newsock.Close();//不需要其它的连接关闭原始的套接字
}
}
}
运行如下,等待客户端的连接,
再编写客户端的控制台程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace TCPClient
{
class Client
{
static void Main(string[] args)
{
//缓存流入流出的消息
byte[] data = new byte[1024];
String input, stringData;//用于显示的临时变量
//初始化要连接的ip和端口号
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
//创建套接字
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
try
{
//将套接字与远程主机相连,此时服务器端应该已经启动Accept
server.Connect(ipep);
}
catch (SocketException e)//连接异常处理
{
Console.WriteLine("Unable to connect to server.");
Console.WriteLine(e.ToString());
return;
}
//根据事先约定,连接后服务器会发欢迎信息,所以接受数据
int recv = server.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
while (true)
{
input = Console.ReadLine();
if(input == "exit")
{
break;
}
server.Send(Encoding.ASCII.GetBytes(input));
data = new byte[1024];//Receive之后,将data的大小还原
recv = server.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Disconnecting from server...");
server.Shutdown(SocketShutdown.Both);//可以只关闭读或者写
server.Close();
}
}
}
启动客户端后,会自动连接服务端9050端口,并显示收到的服务端信息,同时服务端显示连接上的客户端信息: