c# tcp 实现多人聊天
我用c#编写了一个局域网聊天的小软件,但是发现一个问题,单聊的时候怎么样去实现同时和多个人聊呢?就像腾讯的qq一样,可以支持多个人聊天,键入只是简单的show出窗体,会出...
我用c#编写了一个局域网聊天的小软件,但是发现一个问题,单聊的时候怎么样去实现同时和多个人聊呢?就像腾讯的qq一样,可以支持多个人聊天,键入只是简单的show出窗体,会出错,就是一个套接字使用了多次的问题。
请高手帮忙,谢谢了!
最好写的具体点!
我编写的聊天软件没有服务器端,只是两个软件之间就可以聊天,没有通过中间站点的转发,我所说的情况是,已经和一个人单独聊天了,再和另一个人去聊天,我感觉也就得去换一个端口,不能使用同一个端口号。
但是使用UDP传输数据不一定能够准确到达,也就是有一定的失败几率,所以采用tcp,其使用三次握手,更加可靠一些。 展开
请高手帮忙,谢谢了!
最好写的具体点!
我编写的聊天软件没有服务器端,只是两个软件之间就可以聊天,没有通过中间站点的转发,我所说的情况是,已经和一个人单独聊天了,再和另一个人去聊天,我感觉也就得去换一个端口,不能使用同一个端口号。
但是使用UDP传输数据不一定能够准确到达,也就是有一定的失败几率,所以采用tcp,其使用三次握手,更加可靠一些。 展开
2个回答
展开全部
很简单。既然你能写出单聊(也就是P2P),那多人聊天其实是相似的,只要你了解对方的机器IP和端口号,就可以创建一个套接字去连接。
Socket soc = new Socket();
soc.ConnectToServer();
创建连接就是这样的代码,里面的参数需要指定协议(TCP/UDP),IP及端口,然后客户端就可以使用Socket.Send()方法发消息,服务端收到后,可以用TcpListener.AcceptTcpClient()方法收到客户端的Socket,同样调用Send()方法反馈给客户端。
所谓的UDP丢包或者存在准确率误差情况只是相对的,是一种单纯概念上的理解而已。事实上,在局域网这种稳定的网络环境中,使用UDP是最佳的选择,速度快,且编程较TCP方便。至于所谓的握手,无非是为了网络的检测,用在局域网这种层次的网络真的有必要吗,除非你是为了追求一些时髦的用语和技术。如果要设计握手,那应该是应用层上的协议了,这需要你自己来制定。其实,QQ就采用了UDP协议。
至于端口号,一台机器是不能同时开两个相同的监听端口的,但如果收外部的连接要求,一个端口号足够了。比如你开启了端口号2512(Oracle数据库的默认端口)来处理监听,那其他机器只要连接到这个端口号就能与你通信。还是Oracle为例,一个Oracle服务器可以创建与多个客户端的连接,但端口号也都是2512,这并不矛盾,因为服务器只监听一个端口,但它能收到所有的客户端连接,不知道你明白了吗?
Socket soc = new Socket();
soc.ConnectToServer();
创建连接就是这样的代码,里面的参数需要指定协议(TCP/UDP),IP及端口,然后客户端就可以使用Socket.Send()方法发消息,服务端收到后,可以用TcpListener.AcceptTcpClient()方法收到客户端的Socket,同样调用Send()方法反馈给客户端。
所谓的UDP丢包或者存在准确率误差情况只是相对的,是一种单纯概念上的理解而已。事实上,在局域网这种稳定的网络环境中,使用UDP是最佳的选择,速度快,且编程较TCP方便。至于所谓的握手,无非是为了网络的检测,用在局域网这种层次的网络真的有必要吗,除非你是为了追求一些时髦的用语和技术。如果要设计握手,那应该是应用层上的协议了,这需要你自己来制定。其实,QQ就采用了UDP协议。
至于端口号,一台机器是不能同时开两个相同的监听端口的,但如果收外部的连接要求,一个端口号足够了。比如你开启了端口号2512(Oracle数据库的默认端口)来处理监听,那其他机器只要连接到这个端口号就能与你通信。还是Oracle为例,一个Oracle服务器可以创建与多个客户端的连接,但端口号也都是2512,这并不矛盾,因为服务器只监听一个端口,但它能收到所有的客户端连接,不知道你明白了吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询