socket 服务器转发,例如客户端有2个人,A和B,A发消息给B 要经过服务器 意思是A发给socket服务器,服务器发给B 如何实现呢

Eda 2011-11-18 10:39:28
class Program
{
private static byte[] result = new byte[1024];
private static int myProt = 8001; //端口
static Socket serverSocket;

static void Main(string[] args)
{
//服务器IP地址
IPAddress ip = IPAddress.Parse("192.168.1.188");
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
serverSocket.Listen(100); //设定最多10个排队连接请求
Debug.WriteLine("启动监听成功", serverSocket.LocalEndPoint.ToString());
//通过Clientsoket发送数据
Thread myThread = new Thread(ListenClientConnect);
myThread.Start();
Console.ReadLine();
}
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect()
{
while (true)
{

Socket clientSocket = serverSocket.Accept();
string strClientEndpoint = clientSocket.RemoteEndPoint.ToString();//获得客户端IP:PORT
Debug.WriteLine("客户端【" + strClientEndpoint + "】连接成功...");//添加服务端日志

byte[] b = new byte[1024 * 1024 * 2];
clientSocket.Send(Encoding.UTF8.GetBytes("int " + b.Length + "字节" + " sss"));
Thread receiveThread = new Thread(ReceiveMessage);

receiveThread.Start(clientSocket);


}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
///
// List<ListenClientConnect> list = new List<ListenClientConnect>();
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocket.Receive(result);
Debug.Print("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
string s = Encoding.UTF8.GetString(result, 0, receiveNumber);
string s1 = s.Substring(0, 1);

Tian.GetUserMail(int.Parse(s1));


myClientSocket.Send(result);
Thread.Sleep(5000);
myClientSocket.Send(Encoding.ASCII.GetBytes("Server Say2 Hello"));

}
catch (SocketException ex)
{
// Console.WriteLine(ex.Message);
Debug.Print("客户端{0}", myClientSocket.RemoteEndPoint.ToString()+"退出了",ex);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
}
}

//03向客户端发送消息
/// <summary>
/// 向客户端发送消息
/// </summary>
/// <param name="strMsg"></param>
public void Send6(string strMsg)
{
byte[] arrNs = System.BitConverter.GetBytes(strMsg.Length);
byte[] arrMsg = Encoding.UTF8.GetBytes("st");
byte[] arrYs = Encoding.UTF8.GetBytes(strMsg);
byte[] arr = new byte[arrMsg.Length + arrNs.Length + arrYs.Length];
arrMsg.CopyTo(arr, 0);
arrNs.CopyTo(arr, arrMsg.Length);
arrYs.CopyTo(arr, arrMsg.Length + arrNs.Length);
serverSocket.Send(arr);
}
/// <summary>
/// 04向客户端发送文件数据
/// </summary>
/// <param name="strPath">文件路径</param>
public void SendFile(string strPath)
{
//通过文件流 读取文件内容
using (FileStream fs = new FileStream(strPath, FileMode.OpenOrCreate))
{
byte[] arrFile = new byte[1024 * 1024 * 2];
//读取文件内容到字节数组,并 获得 实际文件大小
int length = fs.Read(arrFile, 0, arrFile.Length);
byte[] ss = new byte[length];
Array.Copy(arrFile, 0, ss, 0, length);
//定义一个 新数组,长度为文件实际长度 +1
byte[] arrFileFina = System.BitConverter.GetBytes(length);
byte[] arrMsg = Encoding.UTF8.GetBytes("im");
// arrFileFina[0] = 1;//设置 数据标识位等于1,代表 发送的是文件
//将 文件数据数组 复制到 新数组中,下标从1开始
byte[] arr = new byte[arrFileFina.Length + arrMsg.Length + length];
arrMsg.CopyTo(arr, 0);
arrFileFina.CopyTo(arr, arrMsg.Length);
ss.CopyTo(arr, arrMsg.Length + arrFileFina.Length);

//发送文件数据
serverSocket.Send(arr);//, 0, length + 1, SocketFlags.None);
}
}
}
我现在的源码 是这样的,不知道应该如何在服务器端转发给 B 求源码 谢谢
...全文
616 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2011-11-18
  • 打赏
  • 举报
回复
加好友时必须注明CSDN+号
山东蓝鸟贵薪 2011-11-18
  • 打赏
  • 举报
回复
查看一下我的信息
帮你顶一下先
山东蓝鸟贵薪 2011-11-18
  • 打赏
  • 举报
回复
帮你顶一下先
Eda 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sgzhou12345 的回复:]

中午吧关注一下我的QQ
[/Quote]

您QQ号多少?
铜臂阿铁木 2011-11-18
  • 打赏
  • 举报
回复
A给B发消息的时候可以把A的Socket信息发送给连带数据发送给B,

当B要回复的时候,使用消息头里面的Socket信息找到来源就可以了。

这样的对等A B客户端,都使用UDP。
山东蓝鸟贵薪 2011-11-18
  • 打赏
  • 举报
回复
中午吧关注一下我的QQ
Eda 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sgzhou12345 的回复:]

引用 2 楼 eda00705 的回复:
假如 客户端发来的 是二进制 图片,视频啥的 我也存数据库中?

噢,这样呀,你可以先保存到 临行文件夹下,再读取即可
[/Quote]
您那有没有这方面的例子?或者在我那代码改下 我看看 不好意思 因为刚接触socket
山东蓝鸟贵薪 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 eda00705 的回复:]
假如 客户端发来的 是二进制 图片,视频啥的 我也存数据库中?
[/Quote]
噢,这样呀,你可以先保存到 临行文件夹下,再读取即可
Eda 2011-11-18
  • 打赏
  • 举报
回复
假如 客户端发来的 是二进制 图片,视频啥的 我也存数据库中?
山东蓝鸟贵薪 2011-11-18
  • 打赏
  • 举报
回复
先将数据信息保存到数据库中再传给其它客户端即可

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧