黑马程序员技术交流社区

标题: 开发局域网聊天室的更简单的方法??? [打印本页]

作者: 侯慧杰    时间: 2012-7-8 11:38
标题: 开发局域网聊天室的更简单的方法???
在客户端与客户端发送文件、消息;服务端与客户端发送文件、消息,这几项功能的实现都需要用到老师讲的byte字节数组的第一位作为标志位吗??有没有其他更简便的方法???因为我学过一些WCF服务编程,能不能用WCF实现啊??因为没学过网络编程,所以想请教一些关键技术或思路
作者: 戴水平    时间: 2012-7-8 13:33
可以的如果用是wcf的话,那么你就得定义一个数据契约来实现数据序列化,
建立一个windows 服务定义一个数据契约来处理消息和文件的。当要用到服务的时候,就调用windows服务。
作者: 常静华    时间: 2012-7-8 14:08
功能:服务器首先监听是否有客服端请求连接,如果有则建立连接,然后服务器可选择任一 客户端发送消息,否则继续监听。 由功能可以看出这是面向连接的 TCP 套接字的编程,既需要对服务器和客服端分别编程。 注意编写该软件的目的主要是对套接字编程的简单掌握, 至于软件的美观设计自己可进行相 应的调整。

分析服务器端开发流程: 1). 创建一个套接字。 2). 创建本地 IPEndPoint 对象。 3). 使用 Bind()方法将所创建的套接字与本地 IPEndPoint 绑定。 4). 使用 Listen()方法设置套接字为监听模式。 5). 使用 Accept()方法接收客户端连接请求,并为客户端创建一个客户端套接字。 一旦建立了客服端套接字,就可以和请求连接的客服端进行数据传送了。

分析客户端开发流程: 1). 创建一个套接字。 2). 使用 Socket 类的 Connect 方法将套接字与远程服务器地址相连。

以下是服务器端完整代码附带有具体注释: /// <summary> //功能:简单聊天室 //版本: v1.0 //作者:苏嗣典 //日期: 2011-12-09 /// </summary> using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Net;

namespace Server { public partial class Server : Form { public Server() { InitializeComponent(); RichTextBox.CheckForIllegalCrossThreadCalls = false; //对跨线程不处理 } //拓展知识:套接字用来描述 IP 地址和端口,是通信链的句柄,其实就是用于两个进程间 通信的。 Socket socket_Server = null; //定义一个套接字接口对象,并初始化值为空 Thread myThread = null; //定义一个线程对象,并初始化值为空 Socket socket_Connet = null; //用于与客户端连接 Dictionary<string, Socket> dic = new Dictionary<string, Socket> { }; //定义一个集合, 存储客户 端信息 string RemoteEndPoint; //客户端的网络结点 private void buttonStartListen_Click(object sender, EventArgs e) { socket_Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //new 一个 Socket 对象,注意这里用的是流式 Socket(针对于面向连接的 TCP 服务应用)而不是数据报式 Socket(针对于面向无连接的 UDP 服务应用)。 string IP = textBoxIP.Text.Trim(); IPAddress ServerIP =IPAddress.Parse(IP); //提取 IP 地址 int port=int.Parse (textBoxPort .Text .Trim ()); //port 是端口号 IPEndPoint point = new IPEndPoint(ServerIP, port); //point 为网络结点对象 socket_Server.Bind(point); //将结点绑定到套接字上 socket_Server.Listen(10); //设置连接队列的最大长度,可根据服务器的性能,可以设置更大 程度。 myThread = new Thread(Listen_Disp ); myThread.IsBackground = true; //设置是否为后台线程 myThread.Start(); textBoxListenMsg.AppendText("监听成功!\t\n"); } void Listen_Disp() { while (true) { socket_Connet = socket_Server.Accept(); RemoteEndPoint = socket_Connet.RemoteEndPoint.ToString(); //客户端网络结点号 textBoxListenMsg.AppendText("成功与" + RemoteEndPoint + "客户端建立连接!\t\n"); //显示

与客户端连接情况 dic.Add(RemoteEndPoint, socket_Connet); //添加客户端信息 OnlineList_Disp(RemoteEndPoint); //显示在线客户端 } } void OnlineList_Disp(string Info) { listBoxOnlineList.Items.Add (Info); //在线列表中显示连接的客户端套接字 }

private void buttonSendSmg_Click(object sender, EventArgs e) { string sendMsg = richTextBoxMsg.Text.Trim(); //要发送的信息 byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sendMsg); //将要发送的信息转化为字节 数组,因为 Socket 发送数据时是以字节的形式发送的 if (listBoxOnlineList.SelectedIndex == -1) { MessageBox.Show("请选择要发送的客户端!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop); } else { string selectClient = listBoxOnlineList.Text; //选择要发送的客户端 dic[selectClient].Send(bytes); //发送数据 } } } } 以下是客户端完整代码附带有具体注释: /// <summary> //功能:简单聊天室 //版本: v1.0 //作者:苏嗣典 //日期: 2011-12-09 /// </summary> using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading;

namespace Client { public partial class Client : Form { public Client() { InitializeComponent(); RichTextBox.CheckForIllegalCrossThreadCalls = false; //允许跨线程访问 } Socket socket = null; //定义一个套接字,初始化为空 Thread thread = null; //定义一个线程 private void buttonConnectToServer_Click(object sender, EventArgs e) { string IP = textBoxIP.Text.Trim(); int port =int.Parse (textBoxPort.Text.Trim()); IPAddress ip = IPAddress.Parse(IP); IPEndPoint point = new IPEndPoint(ip, port); //网络结点对象 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初 始化套接字 socket.Connect(point); thread =new Thread (ShowMsg); thread .IsBackground =true; //后台线程 thread.Start (); } void ShowMsg() { while (true) { byte[] bytes = new byte[1024 * 1024 * 3]; //设置字节流数组为3M int length = socket.Receive(bytes); string Msg = System.Text.Encoding.UTF8.GetString(bytes, 0, length); //注意要把字节转化为字 符串 Receive_Show(Msg); //显示接收的信息 } } void Receive_Show(string Info) {

richTextBoxReceiveMsg.AppendText(Info + "\t\n"); } } } 至于控件的具体信息可根据代码中的控件名去猜测, 如果不清楚的可以问我或者在我的博 客资源中下载该软件及其代码。 注意此简单的聊天软件只能用于服务器向客户端单向发送信 息,如果要实现客户端能向服务器发送信息可根据相同原理自己进行完善。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2