在服务器能够向客户机连接传输数据之前,必须做以 下四件事情
•创建一个套接字
•将所创建的套接字与本地IPEndPoint绑定
•设置套接字为收听模式
•在套接字上接收接人的连接
下面对上述过程的实现。在这里没有任务修饰的内容,仅仅是启动服务器并监听客户机连接所必需的内容,也是
读者实现其他功能时应该遵循的一般原则
第一步是创建 Socket对象的一个实例,其他的三个功能都是在该 Socket对象的基础上实现。
请看下面一小段C#程序:
static void Main(string[] args) { IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 9050); Socket socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketListener.Bind(ipLocal); socketListener.Listen(10); Socket client = socketListener.Accept(); }
由Accept()所创建的Socket对象能够用于在服务器和远程客户机之间的任意方向主传送数据
数据。
简单的TCP服务器完整C#小程序(图1:代表客户端telnet 127.0.0.1 9050与服务端的IP和端口一致;图二:表示客户端与服务端建立了连接 图三:客户端发送的数据在服务端接受 图四:客户端关闭时,服务端出现相应提示)
下面是上述结果的C#程序:
class Program { static void Main(string[] args) { int recv; byte[] data = new byte[1024]; IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 19050); Socket socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketListener.Bind(ipLocal); socketListener.Listen(10); Console.WriteLine("Waiting for client......"); Socket socketServer = socketListener.Accept();//阻塞挂起 IPEndPoint ipClient = (IPEndPoint)socketServer.RemoteEndPoint; Console.WriteLine("Connected with IP:{0} at port:{1}",ipClient.Address,ipClient.Port); string welcome = "Welcome to my test server program"; data = Encoding.Default.GetBytes(welcome); socketServer.Send(data, data.Length, SocketFlags.None);////第一次向客户端发送数据 while (true) { data = new byte[1024]; recv = socketServer.Receive(data);//从客户端接受数据 if (recv == 0) break; string serverRecv=Encoding.Default.GetString(data,0,recv); Console.WriteLine("服务端收到客户端发送的内容为:{0}",serverRecv); //socketServer.Send(data, recv, SocketFlags.None);//向客户端发送数据 } Console.WriteLine("Disconnected from {0}", ipClient.Address); socketListener.Close(); socketServer.Close(); Console.ReadLine(); } }