ImageVerifierCode 换一换
格式:DOCX , 页数:86 ,大小:77.39KB ,
资源ID:11046310      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11046310.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Socket通讯c#.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Socket通讯c#.docx

1、Socket通讯c#public class XmlSocket /异步socket诊听 / Incoming data from client.从客户端传来的数据 public static string data = null; / Thread signal.线程 用一个指示是否将初始状态设置为终止的布尔值初始化 ManualResetEvent 类的新实例。 public static ManualResetEvent allDone = new ManualResetEvent(false); /static void Main(string args) / / StartListe

2、ning(); / public static void StartListening() / Data buffer for incoming data. 传入数据缓冲 byte bytes = new Byte1024; / Establish the local endpoint for the socket. 建立本地端口 / The DNS name of the computer / running the listener is . IPAddress ipAddress; String ipString = ConfigurationManager.AppSettings.Ge

3、t(SocketIP); if (ipString=null | ipString =String.Empty) IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName(); ipAddress = ipHostInfo.AddressList0; else ipAddress = IPAddress.Parse(ipString); int port; String portString = ConfigurationManager.AppSettings.Get(SocketPort); if (portString=null |

4、 portString=String.Empty) port = 11001; else port = int.Parse(portString); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); / Create a TCP/IP socket. Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / Bind the socket to the local endpoint and

5、listen for incoming connections.绑定端口和数据 try listener.Bind(localEndPoint); listener.Listen(100); while (true) / Set the event to nonsignaled state.设置无信号状态的事件 allDone.Reset(); / Start an asynchronous socket to listen for connections.重新 启动异步连接 listener.BeginAccept(new AsyncCallback(AcceptCallback), lis

6、tener); / Wait until a connection is made before continuing.等待连接创建后继续 allDone.WaitOne(); catch (Exception e) / public static void AcceptCallback(IAsyncResult ar) try / Signal the main thread to continue.接受回调方法 该方法的此节向主应用程序线程发出信号, /让它继续处理并建立与客户端的连接 allDone.Set(); / Get the socket that handles the cli

7、ent request.获取客户端请求句柄 Socket listener = (Socket)ar.AsyncState; Socket handler = listener.EndAccept(ar); / Create the state object. StateObject state = new StateObject(); state.workSocket = handler; handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), stat

8、e); catch (Exception e) / / / 与接受回调方法一样,读取回调方法也是一个 AsyncCallback 委托。 / 该方法将来自客户端套接字的一个或多个字节读入数据缓冲区,然后再次调用 BeginReceive 方法,直到客户端发送的数据完成为止。 / 从客户端读取整个消息后,在控制台上显示字符串,并关闭处理与客户端的连接的服务器套接字。 / / IAsyncResult 委托 public static void ReadCallback(IAsyncResult ar) try String content = String.Empty; / Retrieve t

9、he state object and the handler socket创建自定义的状态对象 from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket;/处理的句柄 / Read data from the client socket. 读出 int bytesRead = handler.EndReceive(ar); if (bytesRead 0) /业务代码 string result = DoSomeTh

10、ing(.); String len = Encoding.UTF8.GetBytes(result).Length.ToString().PadLeft(8, 0); log.writeLine(len); Send(len + result, handler); catch (Exception e) / private static void Send(String data, Socket handler) try / Convert the string data to byte data using UTF8 encoding. byte byteData = Encoding.U

11、TF8.GetBytes(data); / Begin sending the data to the remote device. handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); catch (Exception e) / / / 发送 / / private static void SendCallback(IAsyncResult ar) try / Retrieve the socket from the state object. Socket

12、handler = (Socket)ar.AsyncState; / Complete sending the data to the remote device.向远端发送数据 int bytesSent = handler.EndSend(ar); StateObject state = new StateObject(); state.workSocket = handler; handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state); h

13、andler.Shutdown(SocketShutdown.Both); handler.Close(); catch (Exception e) / public static void StopListening() allDone.Close(); log.close(); / / 具体处理业务的方法 / / private static string DoSomething(int i) /具体业务代码,返回需要返回的字符串信息 / / 写日志方法 / / 写入内容 public static void WriteLog(string strLog) /写入日志代码 对我有用9 丢个

14、板砖0 引用 举报 管理 TOP 回复次数:800 sjm2003 (地上的菜鸟) 等级: #1楼 得分:0回复于:2008-06-23 08:27:19C# code / 线程执行体,转发消息 / / 传递给线程执行体的用户名,用以与用户通信 private void ThreadFunc(object obj) /通过转发表得到当前用户套接字 Socket clientSkt = _transmit_tbobj as Socket; /主循环 while (true) try /接受第一个数据包。 /由于程序逻辑结构简单,所以在这里对客户机发送的第一个包内容作逐一判断, /这里的实现不够优

15、雅,但不失为此简单模型的一个解决之道。 byte packetBuff = new byte_maxPacket; clientSkt.Receive(packetBuff); string _str = Encoding.Unicode.GetString(packetBuff).TrimEnd(0); /如果是发给不在线好友的信息 if (_str.StartsWith(cmd:FriendMessage) string UserName = _str.Substring(cmd:FriendMessage.Length, 20).Trim(); string MessageS = _st

16、r.Substring(cmd:FriendMessage.Length + 20, _str.Length - cmd:FriendMessage.Length - 20); SaveMessage(obj as string, UserName, MessageS); continue; /如果是离线请求 if (_str.StartsWith(cmd:RequestLogout) _transmit_tb.Remove(obj); UpdateFriendList(string)obj, false, ); / string svrlog = string.Format(系统消息用户 0

17、 在 1 已断开. 当前在线人数: 2rnrn, obj, DateTime.Now, _transmit_tb.Count); / Console.WriteLine(svrlog); /向所有客户机发送系统消息 /foreach (DictionaryEntry de in _transmit_tb) / / string _clientName = de.Key as string; / Socket _clientSkt = de.Value as Socket; / _clientSkt.Send(Encoding.Unicode.GetBytes(svrlog); / Thread

18、.CurrentThread.Abort(); /如果是请求好友列表 if (_str.StartsWith(cmd:RequestFriendList) SerializeFriendList(obj, clientSkt); / 将该用户不在线时的信息发送给用户 DataTable TabMessage = ReadMessage(obj as string); if (TabMessage != null) foreach (DataRow myrow in TabMessage.Rows) if (myrowSendUserName.ToString() = System:Messag

19、e) clientSkt.Send(Encoding.Unicode.GetBytes(myrowMessage.ToString(); else clientSkt.Send(Encoding.Unicode.GetBytes(cmd:FriendMessage + myrowSendUserName.ToString().PadRight(20, ) + myrowMessage.ToString(); /这里不需要再继续接受后继数据包了,跳出当前循环体。 continue; /如果是请求好友列表 /if (_str.StartsWith(cmd:RequestOnLineList) /

20、/ byte onlineBuff = SerializeOnlineList(); / /先发送响应信号,用户客户机的判断 / clientSkt.Send(Encoding.Unicode.GetBytes(cmd:RequestOnLineList); / clientSkt.Send(onlineBuff); / /这里不需要再继续接受后继数据包了,跳出当前循环体。 / continue; / /查找用户 if (_str.StartsWith(Find:FindFriend) DataTable TabFind = TabUser.Clone(); DataRow FindRow =

21、null ; string UserName = _str.Substring(Find:FindFriend.Length, _str.Length - Find:FindFriend.Length); if (UserName.Equals(Find:WhoOnLine) /看谁在线 FindRow = TabUser.Select( ZX = 1); else/精确查找 FindRow = TabUser.Select(UserName = + UserName + ); foreach (DataRow myrow in FindRow) TabFind.ImportRow(myrow

22、); clientSkt.Send(Encoding.Unicode.GetBytes(Find:FindFriend); IFormatter format = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); format.Serialize(stream, TabFind); stream.Position = 0; byte ret = new byte_maxPacket; int count = 0; count = stream.Read(ret, 0, _maxPacket); while (cou

23、nt 0) clientSkt.Send(ret); count = stream.Read(ret, 0, _maxPacket); clientSkt.Send(Encoding.Unicode.GetBytes(Find:FindFriendEnd); stream.Close(); TabFind = null; FindRow = null; /这里不需要再继续接受后继数据包了,跳出当前循环体。 continue; /请求添加好友 if (_str.StartsWith(Find:AddFriendAsk) string UserName = _str.Substring(Find:

24、AddFriendAsk.Length, _str.Length - Find:AddFriendAsk.Length); /通过转发表查找接收方的套接字 if (_transmit_tb.Count != 0 & _transmit_tb.ContainsKey(UserName) Socket receiverSkt = _transmit_tbUserName as Socket; receiverSkt.Send(Encoding.Unicode.GetBytes(Find:AddFriendAsk + obj as string); /这里不需要再继续接受后继数据包了,跳出当前循环体

25、。 continue; /回复答应添加好友 if (_str.StartsWith(Find:AddFriendYes) string UserName = _str.Substring(Find:AddFriendYes.Length, _str.Length - Find:AddFriendYes.Length); / 保存数据 DataTable TabmyFriend = new DataTable() ; /保存该用户 TabmyFriend.ReadXml(MyPath + UserFriend + obj as string + .xml); DataRow newRow = T

26、abmyFriend.NewRow(); newRowUserName = UserName; TabmyFriend.Rows.Add(newRow); TabmyFriend.WriteXml(MyPath + UserFriend + obj as string + .xml, XmlWriteMode.WriteSchema, false); /保存其好友 TabmyFriend = new DataTable(); TabmyFriend.ReadXml(MyPath + UserFriend + UserName + .xml); DataRow newRow1 = TabmyFr

27、iend.NewRow(); newRow1UserName = obj as string; TabmyFriend.Rows.Add(newRow1); TabmyFriend.WriteXml(MyPath + UserFriend + UserName + .xml, XmlWriteMode.WriteSchema, false); TabmyFriend = null; SerializeFriendList(obj, clientSkt); 对我有用1 丢个板砖1 引用 举报 管理 TOP 精华推荐:程序员多少岁是合适结婚的 sjm2003 (地上的菜鸟) 等级: #2楼 得分:0回复于:2008-06-23 08:32:35C# code /开始按钮事件 private void button1_Click(object sender, System.EventArgs e) /取得预保存的文件名 string fileName=textBox3.Text.Trim(); /远程主机 string hostName=textBox1.Text.Trim(); /端

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1