C# Socket基本编程一
同步字符串的服务端与客户端通信
客户端:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Client running...");
TcpClient myTcpClient ;
for (int i = 0; i < 2; i++)
{
myTcpClient = new TcpClient();
try
{
myTcpClient.Connect("localhost", 8500);
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Server Connect!{0}-->{1}", myTcpClient.Client.LocalEndPoint, myTcpClient.Client.RemoteEndPoint);//前者为本机端口,后者为服务器端口
string msg = Console.ReadLine();
NetworkStream streamtoServer = myTcpClient.GetStream();
byte[] buffer = Encoding.Unicode.GetBytes(msg); //将信息打包
streamtoServer.Write(buffer, 0, buffer.Length); //将信息写入网络流
Console.WriteLine("Sent:{0}",msg);
}
Console.ReadLine();
}
}
}
分析上面的程序:首先定义一个“为TCP网络服务提供客户端连接”的TCPClient类的对象,这样客户端才能进行连接。然后进入循环(因为是多个客户端连接)。TcpClient类的Connect函数的参数包括(本地端口号,连接端端口号)。
接下来的是向服务端输出文本的部分。NetworkStream 是提供用于网络访问的基本数据流类,以TcpClient的实例对象所返回的用于发送和接收的网络数据流进行NetworkStream进行初始化。然后将输入的文本转换成字节序列“byte[] buffer = Encoding.Unicode.GetBytes(msg); //将信息打包”,然后这样才能将字节序列写入网络数据流。
streamtoServer.Write(buffer, 0, buffer.Length); //将信息写入网络流
这个函数的参数表对应是字节序列,所读取字节的起始位置,字节长度。
服务端:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace server
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Server is running....");
const int bufferside = 8192;
IPAddress myIp=new IPAddress(new byte[]{127,0,0,1}); //127.0.0.1是本机的IP
TcpListener myTcpListener = new TcpListener(myIp, 8500);
myTcpListener.Start(); //侦听可用连接
Console.WriteLine("Start Listening...");
while (true)
{
TcpClient remoteclient = myTcpListener.AcceptTcpClient(); //?获取一个链接?
Console.WriteLine("client connect!{0}<-{1}", remoteclient.Client.LocalEndPoint, remoteclient.Client.RemoteEndPoint);
NetworkStream streamToClient = remoteclient.GetStream();
byte[] buffer = new byte[bufferside];
int bytesRead = streamToClient.Read(buffer, 0, bufferside);
Console.WriteLine("Reading data,{0}byte...", bytesRead);
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead); //解码传输数据
Console.WriteLine("Received:{0}", msg);
}
Console.ReadLine();
}
}
}
分析上面的程序:首先定义本机,即服务端的地址,然后再以服务端IP和服务端端口号为参数实例化一个网络侦听的对象TcpListener(从TCP客户端侦听连接),TcpListener类的Start()函数说明这个类的对象开始侦听连接。
在循环中,“TcpClient remoteclient = myTcpListener.AcceptTcpClient();”这一句以TcpListener所侦听得到的一个连接初始化一个客户端对象,然后以侦听到的客户端的网络数据流初始化一个数据流对象。接着用这个数据流对象的Read函数读取流中的数据(这个时候仍然是字节形式的)。然后再调用Encoding.Unicode.GetString(buffer, 0, bytesRead),获取流中字符串。