日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#.NET 比较好用的tcp通信模板(服务器端篇)

發布時間:2025/3/20 C# 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#.NET 比较好用的tcp通信模板(服务器端篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


二話不說,大家先看一下我服務端添加的引用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using commands;


注意一下,這里的最后一個引用commands,與客戶端的commands必須是同一個dll,同樣的代碼編譯出來的文件都不行。這是為什么

捏。試想一下,你用一個規則去序列化一個對象,然后用另一個規則進行反序列化,得到的對象不會是原來的對象了吧。


好,下一步。這里是服務器端,每一個客戶端連到服務器,都對應一個類的對象,然后把它們搞到一個列表里面。這樣就方便進行操作了。在這個基礎上,給客戶端

發信息,或者轉發一個客戶端的信息給另一個或多個客戶端,都是小case了。

下面就是客戶端對應的類了。

public class InConnectUser
{
public TcpClient client { get; set; }
public BinaryReader br { get; set; }
public BinaryWriter bw { get; set; }

public Guid InUseID { get; set; }
public bool IfUserLogin=false;

public Entity.FeeRules obj_enFeeRules = new Entity.FeeRules();
public Entity.InUse obj_enInUse = new Entity.InUse();
public Entity.Computer obj_enComputer = new Entity.Computer();
public Entity.User obj_enUser = new Entity.User();

public InConnectUser(TcpClient client)
{
this.client = client;
NetworkStream networkstream
= client.GetStream();
br
= new BinaryReader(networkstream);
bw
= new BinaryWriter(networkstream);
}
public void Close()
{
br.Close();
bw.Close();
client.Close();
}
}



我這里是和網吧管理相關的,所以加了很多邏輯方面的東西在里面就不貼出來占篇幅了。大家如果把代碼copy過去發現出錯,就注釋掉吧。

話不多,看到關鍵的地方都寫在下面的注釋里面。



//在線用戶列表
private List<TcpHelper.InConnectUser> onlineUserList = new List<TcpHelper.InConnectUser>();
IPAddress localAddress;
private const int port = 51888;
private TcpListener myListener;

//開啟服務器的按鈕
private void button_StartServer_Click(object sender, EventArgs e)
{
myListener
= new TcpListener(localAddress, port);
myListener.Start();
label_status.Text
= "開啟";

Thread myThread
= new Thread(ListenClientConnect);
myThread.Start();
//timer1.Enabled = true;
button_StartServer.Visible = false;
button_StopServer.Visible
= true;
}
//關閉服務器的按鈕
private void button_StopServer_Click(object sender, EventArgs e)
{
label_status.Text
= "關閉";
//關閉服務器,移除list的用戶。
//for (int i = onlineUserList.Count - 1; i >= 0; i--)
//{
// RemoveOnlineUser(onlineUserList[i]);
//}
myListener.Stop();
button_StartServer.Visible
= true;
button_StopServer.Visible
= false;
}

/// <summary>
/// 監聽連接
/// </summary>
private void ListenClientConnect()
{
TcpClient newClient
= null;
while (true)
{
try
{
//停在此處監聽連接,如果有新客戶端連接就運行下去
newClient = myListener.AcceptTcpClient();
}
catch (Exception)
{

break;
}
InConnectUser user
= new InConnectUser(newClient);
Thread threadReceive
= new Thread(ReceiveData);
threadReceive.Start(user);
onlineUserList.Add(user);

}

}



/// <summary>
/// 收消息
/// </summary>
/// <param name="UserState"></param>
private void ReceiveData(object UserState)
{
InConnectUser user
= (InConnectUser)UserState;
TcpClient client
= user.client;
MessageInfo receiveObject;

while (true)
{
try
{
byte[] bytes = new byte[999];
//停在此處,networkstream流中有新數據則讀出
int i = user.br.Read(bytes, 0, 999);
MemoryStream memory
= new MemoryStream(bytes);
BinaryFormatter format
= new BinaryFormatter();
receiveObject
= (MessageInfo)format.Deserialize(memory);
}
catch (Exception)
{
return;
}
switch (receiveObject.CommandsTypes)
{
case CommandsTypes.RequestHowLong:
//這里是我處理各種命令的方法,和這個博客的主題無關,就不貼出來了。
//處理好之后,就在這個方法里面發送回應給對應的客戶端,所以一定要有參數user
// ManagerHowLong(user);
break;
case CommandsTypes.RequestUserLogin:
// ManagerUserLogin(user, receiveObject);
break;
case CommandsTypes.RequestUserlogout:
// ManagerUserLogout(user);
break;
case CommandsTypes.RequestLogout:
//注意這里是return,本意是如果客戶端的連接要關閉, 就用跳出循環
//但是我的是網吧管理,不考慮這種情況,所以就未做處理
return;
case CommandsTypes.RequestModPWD:
// ManagerModPWD(user, receiveObject);
break;
case CommandsTypes.RequestMachineLogin:
// ManagerMachineLogin(user, receiveObject);
break;

case CommandsTypes.RequestTalk:
// ManagerTalk(receiveObject);
break;

default:
break;
}

}

}

/// <summary>
/// 發消息
/// </summary>
/// <param name="user">發給誰</param>
/// <param name="userSend">發送內容</param>
private void SendToClient(TcpHelper.InConnectUser user, MessageInfo userSend)
{
try
{
MemoryStream memory
= new MemoryStream();
BinaryFormatter format
= new BinaryFormatter();
format.Serialize(memory, userSend);
byte[] bytes = memory.ToArray();

user.bw.Write(bytes);
user.bw.Flush();

}
catch (Exception)
{
//發送失敗
}
}

代碼不多,但是也要花點小時間去看看條理才會清晰。

龍弟弟奉獻,轉載請注明出處謝謝。

另外我這里有根據這個做成的小聊天程序,大家如果有需要可以找我。

http://files.cnblogs.com/salty/tcp.rar



轉載于:https://www.cnblogs.com/salty/archive/2011/04/01/2001798.html

總結

以上是生活随笔為你收集整理的C#.NET 比较好用的tcp通信模板(服务器端篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。