c#socket服務器怎樣把客戶端1發送的的訊息給一個客戶端2
uj5u.com熱心網友回復:
兩個客戶端如果都在各自的內網內,那么需要一個服務器端,服務器部署在公網上,兩個客戶端先連上服務器端,保持連接,然后轉發uj5u.com熱心網友回復:
都是在一個局域網里面,但是這個就是不知道怎么轉發uj5u.com熱心網友回復:
就是客戶端1發一條資訊,比如按16進制發 02 02 03 04 05 01 第一個02表示客戶端編號 也就是往客戶端2發 服務器收到這條資訊 檢查一下第一位是02 就將這條資訊發給客戶端2 這里訊息格式看你要怎么定 能讓服務器認出是給哪個客戶端發就OK
uj5u.com熱心網友回復:
我的一個客戶端是硬體esp8266這個是直接發送資訊不指定,指定需要服務器指定發送給另外一個服務器uj5u.com熱心網友回復:
了解一下HPSocketuj5u.com熱心網友回復:
UDP搞起啊uj5u.com熱心網友回復:
不了解這個,之前上課老師講用socket通信uj5u.com熱心網友回復:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
namespace SocketServerAcceptMultipleClient
{
public class SocketServer
{
// 創建一個和客戶端通信的套接字
static Socket socketwatch = null;
//定義一個集合,存盤客戶端資訊
static Dictionary<string, Socket> clientConnectionItems = new Dictionary<string, Socket> { };
public static void Main(string[] args)
{
//定義一個套接字用于監聽客戶端發來的訊息,包含三個引數(IP4尋址協議,流式連接,Tcp協議)
socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//服務端發送資訊需要一個IP地址和埠號
IPAddress address = IPAddress.Parse("127.0.0.1");
//將IP地址和埠號系結到網路節點point上
IPEndPoint point = new IPEndPoint(address, 7777);
//此埠專門用來監聽的
//監聽系結的網路節點
socketwatch.Bind(point);
//將套接字的監聽佇列長度限制為20
socketwatch.Listen(20);
//負責監聽客戶端的執行緒:創建一個監聽執行緒
Thread threadwatch = new Thread(watchconnecting);
//將表單執行緒設定為與后臺同步,隨著主執行緒結束而結束
threadwatch.IsBackground = true;
//啟動執行緒
threadwatch.Start();
Console.WriteLine("開啟監聽。。。");
Console.WriteLine("點擊輸入任意資料回車退出程式。。。");
Console.ReadKey();
Console.WriteLine("退出監聽,并關閉程式。");
}
//監聽客戶端發來的請求
static void watchconnecting()
{
Socket connection = null;
//持續不斷監聽客戶端發來的請求
while (true)
{
try
{
connection = socketwatch.Accept();
}
catch (Exception ex)
{
//提示套接字監聽例外
Console.WriteLine(ex.Message);
break;
}
//獲取客戶端的IP和埠號
IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address;
int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port;
//讓客戶顯示"連接成功的"的資訊
string sendmsg = "連接服務端成功!\r\n" + "本地IP:" + clientIP + ",本地埠" + clientPort.ToString();
byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsg);
connection.Send(arrSendMsg);
//客戶端網路結點號
string remoteEndPoint = connection.RemoteEndPoint.ToString();//ip和埠
//顯示與客戶端連接情況
Console.WriteLine("成功與" + remoteEndPoint + "客戶端建立連接!\t\n");
//添加客戶端資訊
clientConnectionItems.Add(remoteEndPoint, connection);
//IPEndPoint netpoint = new IPEndPoint(clientIP,clientPort);
IPEndPoint netpoint = connection.RemoteEndPoint as IPEndPoint;
//創建一個通信執行緒
ParameterizedThreadStart pts1 = new ParameterizedThreadStart(recv);
// ParameterizedThreadStart pts2 = new ParameterizedThreadStart(send);
Thread thread1 = new Thread(pts1);
// Thread thread2 = new Thread(pts2);
//設定為后臺執行緒,隨著主執行緒退出而退出
thread1.IsBackground = true;
//啟動執行緒
// thread2.IsBackground = true;
//啟動執行緒
// thread2.Start(connection);
thread1.Start(connection);
}
}
static string messag = null;
/// <summary>
/// 接收客戶端發來的資訊,客戶端套接字物件
/// </summary>
/// <param name="socketclientpara"></param>
static void recv(object socketclientpara)
{
Socket socketServer = socketclientpara as Socket;
while (true)
{
//創建一個記憶體緩沖區,其大小為1024位元組
byte[] arrServerRecMsg = new byte[1024];
//將接收到的資訊存入到記憶體緩沖區,并回傳其位元組陣列的長度
try
{
int length = socketServer.Receive(arrServerRecMsg);
//將機器接受到的位元組陣列轉換為人可以讀懂的字串
string strSRecMsg = Encoding.ASCII.GetString(arrServerRecMsg, 0, length);
//將發送的字串資訊附加到文本框txtMsg上
Console.WriteLine("客戶端:" + socketServer.RemoteEndPoint + ",time:" + GetCurrentTime() + "\r\n" + strSRecMsg + "\r\n\n");
Console.WriteLine("**********************" + strSRecMsg + "\r\n\n");
socketServer.Send(arrServerRecMsg ,length ,0);
//
}
catch (Exception ex)
{
clientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString());
Console.WriteLine("Client Count:" + clientConnectionItems.Count);
//提示套接字監聽例外
Console.WriteLine("客戶端" + socketServer.RemoteEndPoint + "已經中斷連接" + "\r\n" + ex.Message + "\r\n" + ex.StackTrace + "\r\n");
//關閉之前accept出來的和客戶端進行通信的套接字
socketServer.Close();
break;
}
}
}
/* static void send(object socketclientpara)
{
Socket socketServer = socketclientpara as Socket;
while (true)
{
//創建一個記憶體緩沖區,其大小為1024位元組
// byte[] arrServerRecMsg = new byte[1024];
//將接收到的資訊存入到記憶體緩沖區,并回傳其位元組陣列的長度
try
{
// int length = socketServer.Receive(arrServerRecMsg);
//將機器接受到的位元組陣列轉換為人可以讀懂的字串
// string strSRecMsg = Encoding.ASCII.GetString(arrServerRecMsg, 0, length);
socketServer.Send(Encoding.ASCII.GetBytes(messag));
//將發送的字串資訊附加到文本框txtMsg上
Console.WriteLine("服務器:" + socketServer.RemoteEndPoint + ",time:" + GetCurrentTime() + "\r\n" + messag + "\r\n\n");
Console.WriteLine("**********************" + messag + "\r\n\n");
socketServer.Send(Encoding.ASCII.GetBytes(messag));
}
catch (Exception ex)
{
clientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString());
Console.WriteLine("Client Count:" + clientConnectionItems.Count);
//提示套接字監聽例外
Console.WriteLine("客戶端" + socketServer.RemoteEndPoint + "已經中斷連接" + "\r\n" + ex.Message + "\r\n" + ex.StackTrace + "\r\n");
//關閉之前accept出來的和客戶端進行通信的套接字
socketServer.Close();
break;
}
}*/
///
/// 獲取當前系統時間的方法
/// 當前時間
static DateTime GetCurrentTime()
{
DateTime currentTime = new DateTime();
currentTime = DateTime.Now;
return currentTime;
}
}
}
這個代碼應該怎么改,只能接受不同客戶端發送的訊息卻不能發送訊息給客戶端
uj5u.com熱心網友回復:
MiniSocket可以下載這個來開發socket tcp應用,比較方便,https://bbs.csdn.net/topics/394702135uj5u.com熱心網友回復:
每次客戶端與服務端連接,服務端保存每個客戶端的唯一標識,這個標識用什么方法隨便你,當其中一個客戶端向服務端發送訊息,需要帶有目標客戶端的唯一標識,舉個很簡單的例子,QQ號為什么不能重復,就是這個意思,這樣服務端就能把客戶端的訊息轉發給另一個客戶端轉載請註明出處,本文鏈接:https://www.uj5u.com/net/110450.html
標籤:C#
