C# Socket通信(C/S)

Socket-Server(服务端程序):

class User//创建客户端类
{
    public TcpClient client { get; private set; }
    //public BinaryReader br { get; private set; }
    //public BinaryWriter bw { get; private set; }
    public StreamReader br { get; private set; }
    public StreamWriter bw { get; private set; }
    public string userName { get; set; }//设备名
    public string remoteEndPoint { get; set; }//设备远程地址

    public User(TcpClient client)
    {
        this.client = client;
        //this.client.ReceiveTimeout = 60000;
        NetworkStream networkStream = client.GetStream();
        //networkStream.ReadTimeout = 5000;
        //br = new BinaryReader(networkStream);//将消息长度与消息一起发送
        //bw = new BinaryWriter(networkStream);
        br = new StreamReader(networkStream);//使用特殊标记分隔消息
        bw = new StreamWriter(networkStream);
        userName = null;
        remoteEndPoint = client.Client.RemoteEndPoint.ToString();
    }

    public void Close()
    {
        br.Close();
        bw.Close();
        client.Close();
      
    }
}

using System.Windows.Forms;
using System.Configuration;
using System.Collections.Specialized;
using System.Xml;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Diagnostics;
using System.Collections;
using System.IO;
using System.Runtime.InteropServices;



private TcpListener myListener;//新建TcpListenser对象
private List<User> userList = new List<User>();// 保存连接的所有用户
private string remoteDevice = null;//远程目标地址
private int indexDevice = 0;//远程目标地址索引
User deviceUser = null;//定义目标用户
Thread myThread=null;//新建一个监听线程

/// <summary>
/// 初始化服务端
/// </summary>
private void ServerInit()
{
    try
    {
        string ip = null;
        string name = Dns.GetHostName();
        IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
        foreach (IPAddress ipa in ipadrlist)
        {
            if (ipa.AddressFamily == AddressFamily.InterNetwork)
            {
                ip = ipa.ToString();
            }
        }
        myListener = new TcpListener(IPAddress.Parse(ip), SystemInfo.Port);
        myListener.Start();
        //创建一个线程监客户端连接请求
        myThread = new Thread(ListenClientConnect);
        myThread.Start();
    }
    catch (Exception ipEX)
    {
        MessageBox.Show(ipEX.Message);
    }

}


/// <summary>
/// 接收客户端连接
/// </summary>
private void ListenClientConnect()
{
    TcpClient newClient = null;
    while (true)
    {
        try
        {
            newClient = myListener.AcceptTcpClient(); //当接收到客户端连接
        }
        catch
        {
         //当单击‘停止监听’或者退出此窗体时 AcceptTcpClient()会产生异常
         //因此可以利用此异常退出循环
            break;
        }
        //每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息;
        User user = new User(newClient);
        Thread threadReceive = new Thread(ReceiveData);
        threadReceive.Start(user);
        userList.Add(user);
        //SendToClient(user, "ok");
        try
        {
            //ListviewAdd(user.remoteEndPoint);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }
    }

}


/// <summary>
/// 处理接收的客户端信息
/// </summary>
/// <param name="userState">客户端信息</param>
private void ReceiveData(object userState)
{
    User user = (User)userState;
    TcpClient client = user.client;
    while (true)//当没有退出
    {
        string receiveString = null;
        try
        {
            //从网络流中读出字符串,此方法会自动判断字符串长度前缀
            receiveString = user.br.ReadLine();
        }
        catch (Exception)//user失去联系
        {
            //RemoveUser(user);
            break;
        }
        switch (receiveString)
        {

            case "ok": 
                break;
            default: ;
                break;
        }
    }

}


/// <summary>
/// 发送 message 给 user
/// </summary>
/// <param name="user">指定发给哪个用户</param>
/// <param name="message">信息内容</param>
private void SendToClient(User user, string message)
{
    try
    {
        //将字符串写入网络流,此方法会自动附加字符串长度前缀
        //user.bw.WriteLine(message);
        user.bw.Write(message);
        user.bw.Flush();

    }
    catch
    {

    }
}

/// <summary>
/// 移除用户
/// </summary>
/// <param name="user">指定要移除的用户</param>
private void RemoveUser(User user)
{
    userList.Remove(user);
    user.Close();
}


try
{
    ServerInit();//调用Socket服务端监听程序 
}
catch (Exception ex)
{

    MessageBox.Show(ex.Message);
}

Socket-Scilent(客户端程序): 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using Socket_Cilent;
using System.Threading;
using System.IO;



private string ServerIP; //IP
private int port;   //端口
private bool isExit = false;
private TcpClient client;
private BinaryReader br;
private BinaryWriter bw;



private void ReceiveData()//接收函数
{
    string receiveString = null;
    while (isExit == false)
    {
        try
        {
            //从网络流中读出字符串
            //此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串
            receiveString = br.ReadString();
        }
        catch
        {
            if (isExit == false)
            {
                MessageBox.Show("与服务器失去连接");
            }
            break;
        }
        txt_recStr.Text += receiveString;
        //txt_recStr.AppendText(receiveString);
    }
    Application.Exit();
}



try
{
    
    ServerIP = txt_IP.Text.Trim(); //设定IP
    port = Convert.ToInt32(txt_Port.Text.Trim()); //设定端口
    //此处为方便演示,实际使用时要将Dns.GetHostName()改为服务器域名
    //IPAddress ipAd = IPAddress.Parse("182.150.193.7");
    client = new TcpClient();
    client.Connect(IPAddress.Parse(ServerIP), port);
    MessageBox.Show("连接成功");
}
catch (Exception ex)
{

    MessageBox.Show("连接失败,原因:" + ex.Message);
}
//获取网络流
NetworkStream networkStream = client.GetStream();
//将网络流作为二进制读写对象
br = new BinaryReader(networkStream);
bw = new BinaryWriter(networkStream);
Thread threadReceive = new Thread(new ThreadStart(ReceiveData));
threadReceive.IsBackground = true;
threadReceive.Start();       

转载地址:C# Socket网络编程精华篇 - 微冷的雨 - 博客园

猜你喜欢

转载自blog.csdn.net/lvxingzhe3/article/details/121887088