程序中 常用方法列表:
(1)Socket(AddressFamily af,SocketType st,ProtocolType pt)
创建套接字,并且返回新建套接字句柄st。对于客户端来说,也是在本地创建套接字。
(2)bind(IPEndPoint iep)
对于服务器方的程序来说,建立的套接字必须要绑定到本地计算机的IP地址和端口号上。
(3)listen(int backlog)
这个方法用于等待客户端发出连接的请求,待其执行完则说明服务器方已经准备好受 来自客户端的连接。
其中的backlog参数是指用户的连接数,超过连接数的 其他客户不得与服务器方进一步通信。
(4)accept()
它的功能是,当有新客户连接时,返回一个新的套接字句柄。当程序执行到该方法时会 处于阻塞状态, 直到有
新的客户机请求连接,accept()方法会返回包含客户端信息的套接字句柄。
(5)connect(IPEndPoint iep)
此方法是客户机独有的,它负责把自己新创建的套接字与本地地址相绑定,与bind()方法相对应。
(6)Send()/Receive()
这两个方法在完成了客户端的连接后,就可以通过它们进行数据传送了。
(7)ShutDown()
这个方法在通信完成以后负责把连接释放,并关闭socket对象。
程序逻辑流程图:
服务器端代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- namespace SocketServerTest11
- {
- class Program
- {
- static void Main(string[] args)
- {
- int port = 5800;
- string host = "192.168.5.187";
- //创建终结点(EndPoint)
- IPAddress ip = IPAddress.Parse(host); //把ip地址字符串转换为IPAddress类型的实例
- //用指定的端口和ip初始化IPEndPoint类的新实例
- IPEndPoint ipe = new IPEndPoint(ip, port);
- //创建socket并开始监听
- //创建一个socket对象,如果用udp协议,则要用SocketType.Dgram类型的套接字
- Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
- ProtocolType.Tcp);
- s.Bind(ipe); //绑定EndPoint对象(5800端口和ip地址)
- s.Listen(0); //开始监听
- Console.WriteLine("等待客户端连接");
- //接收到client连接,为此连接建立新的socket,并接受信息
- Socket temp = s.Accept();//为新建连接创建新的socket
- Console.WriteLine("建立连接");
- string recvStr = "";
- byte[] recvBytes = new byte[1024];
- int bytes;
- bytes = temp.Receive(recvBytes, recvBytes.Length, 0); //从客户端接受信息
- recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
- //给Client端返回信息
- Console.WriteLine("server get message:{0}", recvStr); //把客户端传来的信息显示出来
- string sendStr = "ok!Client send message successful!";
- byte[] bs = Encoding.ASCII.GetBytes(sendStr);
- temp.Send(bs, bs.Length, 0);//返回信息给客户端
- temp.Close();
- s.Close();
- Console.ReadKey();
- }
- }
- }
客户端端代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- namespace SocketClientTest11
- {
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- int port = 5800;
- string host = "192.168.5.187";
- //创建终结点EndPoint
- IPAddress ip = IPAddress.Parse(host);
- IPEndPoint ipe = new IPEndPoint(ip, port); //把ip和端口转换为IPEndpoint
- 实例
- //创建socket并连接到服务器
- Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
- ProtocolType.Tcp);
- //创建Socket
- Console.WriteLine("Connecting...");
- c.Connect(ipe);//连接到服务器
- //向服务器发送信息
- string sendStr = "hello!This is a socket test";
- byte[] bs = Encoding.ASCII.GetBytes(sendStr); //把字符串编码为字节
- Console.WriteLine("Send Message");
- c.Send(bs, bs.Length, 0); //发送信息
- //接受从服务器返回的信息
- string recvStr = "";
- byte[] recvBytes = new byte[1024];
- int bytes;
- bytes = c.Receive(recvBytes, recvBytes.Length, 0); //从服务器端接受返回信息
- recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
- Console.WriteLine("client get message:{0}", recvStr); //显示服务器返回信息
- //一定记着用完socket后要关闭
- c.Close();
- }
- catch (ArgumentNullException e)
- {
- Console.WriteLine("argumentNullException:{0}", e);
- }
- catch (SocketException e)
- {
- Console.WriteLine("SocketException:{0}", e);
- }
- Console.WriteLine("Press Enter to Exit");
- Console.ReadKey();
- }
- }
- }
程序执行结果截图: