C#socket通信

qq_42108220 2019-06-03 08:06:52
c#socket服务器怎样把客户端1发送的的消息给一个客户端2
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
groveer 2019-10-11
  • 打赏
  • 举报
回复
每次客户端与服务端连接,服务端保存每个客户端的唯一标识,这个标识用什么方法随便你,当其中一个客户端向服务端发送消息,需要带有目标客户端的唯一标识,举个很简单的例子,QQ号为什么不能重复,就是这个意思,这样服务端就能把客户端的消息转发给另一个客户端
「已注销」 2019-10-10
  • 打赏
  • 举报
回复
MiniSocket可以下载这个来开发socket tcp应用,比较方便,https://bbs.csdn.net/topics/394702135
大鱼> 2019-06-04
  • 打赏
  • 举报
回复
了解一下HPSocket
qq_42108220 2019-06-04
  • 打赏
  • 举报
回复
我的一个客户端是硬件esp8266这个是直接发送信息不指定,指定需要服务器指定发送给另外一个服务器
OrdinaryCoder 2019-06-04
  • 打赏
  • 举报
回复
引用 2 楼 qq_42108220 的回复:
都是在一个局域网里面,但是这个就是不知道怎么转发

就是客户端1发一条信息,比如按16进制发 02 02 03 04 05 01 第一个02表示客户端编号 也就是往客户端2发 服务器收到这条信息 检查一下第一位是02 就将这条信息发给客户端2 这里消息格式看你要怎么定 能让服务器认出是给哪个客户端发就OK
qq_42108220 2019-06-04
  • 打赏
  • 举报
回复
都是在一个局域网里面,但是这个就是不知道怎么转发
qq_42108220 2019-06-04
  • 打赏
  • 举报
回复
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;
}
}
}

这个代码应该怎么改,只能接受不同客户端发送的消息却不能发送消息给客户端
qq_42108220 2019-06-04
  • 打赏
  • 举报
回复
不了解这个,之前上课老师讲用socket通信
m0_37646670 2019-06-04
  • 打赏
  • 举报
回复
UDP搞起啊
threenewbee 2019-06-03
  • 打赏
  • 举报
回复
两个客户端如果都在各自的内网内,那么需要一个服务器端,服务器部署在公网上,两个客户端先连上服务器端,保持连接,然后转发

110,566

社区成员

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

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

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