这段时间再看socket编程,虽然现在是刚刚接触,但是还是忍不住想写一篇总结,来激励自己努力学习,写的不好的地方,还请大家指教啊!

下面针对一个简单的发送消息和文件的程序说说吧。   首先是服务器需要准备二个Socket和二个Thread如下:

//和客户机进行通信
private Socket sckCommit;
//监听客户机
private Socket sckListen;
private Thread thdListen;
private Thread thdCommit;

对客户机的监听和通信放在二个单独的线程中,服务端的简单界面如下:

点击启动按钮时调用下面的函数:

#region 初始化监听
//初始化监听
public void Listen()
{
try
{
string ip = txtIp.Text.Trim();
string port = txtPort.Text.Trim();
//创建IP地址
IPAddress ipaddress = IPAddress.Parse(ip);
//创建IP节点
IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(port));
//创建套接字
sckListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定IP节点
sckListen.Bind(endpoint);
sckListen.Listen();//10为同时最大连接数 //在单独的线程里监听
thdListen = new Thread(Watch);
thdListen.IsBackground = true;
thdListen.Start();
ShowMsg("服务器启动.................");
}
catch (Exception ex)
{
ShowErr(ex);
}
}
#endregion #region 在单独的线程里监听端口
public void Watch()
{
while (true)
{
try
{
sckCommit= sckListen.Accept();
thdCommit = new Thread(ReceiveMsg);
thdCommit.IsBackground = true;
thdCommit.Start();
ShowMsg("监听到连接");
}
catch (Exception ex)
{
ShowErr(ex);
break;
}
}
}
#endregion

启动服务器进行监听,程序运行到sckCommit= sckListen.Accept();时,由于Accept();阻塞运行等待客户的连接,然后开始启动接受消息的线程。

public void ReceiveMsg()
{
while (true)
{
try
{
byte[] b = new byte[ * * ];
int size = sckCommit.Receive(b);
string msg = Encoding.UTF8.GetString(b, , size);
ShowMsg(msg);
}
catch (Exception ex)
{
ShowErr(ex);
break;
}
}
}

对于客户端,首先需要主动与服务器进行连接,客户端截图如下:

点击连接时,调用下面的函数:

public void Connnetion()
{
try
{
sckConnection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建ip地址
IPAddress ipaddress = IPAddress.Parse(txtIp.Text.Trim());
//创建IP节点
IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPort.Text.Trim()));
//连接ip地址为txtIp.Text.Trim()Port为txtPort.Text.Trim()
sckConnection.Connect(endpoint);
thdConnection = new Thread(ReceiveMsg);
thdConnection.IsBackground = true;
thdConnection.Start();
}
catch (Exception ex)
{
ShowErr(ex);
}
} public void ReceiveMsg()
{
while (true)
{
try
{
byte[] byteMsg = new byte[ * * ];
int length = sckConnection.Receive(byteMsg);
if (byteMsg[] == )
{
string strMsg = Encoding.UTF8.GetString(byteMsg, , length-);
ShowMsg(strMsg);
}
else if (byteMsg[] == )
{
//OpenFileDialog sfd = new OpenFileDialog();
//if (sfd.ShowDialog() == DialogResult.OK)
//{
// string savePath = sfd.FileName;
using (FileStream fs = new FileStream(@"1.txt", FileMode.Create))
{
fs.Write(byteMsg, , length - );
ShowMsg("文件保存成功:");
}
//}
}
else
{
ShowMsg("sdf");
} }
catch (Exception ex)
{
ShowErr(ex);
break;
}
}
}

这样就能接受服务器发来的数据了,为了节省篇幅,其他重复性的代码就不粘上来了。

还需要注意的是,如何区别发送的是文件还是消息还是窗口抖动,我的做法就是在发送的字节数组的第一位做一个标记位,

如果是0怎发送的是字符串,如果是1则发送的是文件,如果是2则发送的是窗口抖动。

对于文件和字符串上面的代码都有,窗口抖动现在还没实现,我的思路是用一个for循环,循环10-30次,每一次都用随机数生成x,y二个数然后加在

窗口的现在的坐标上,就能实现窗口的抖动了。

哈哈,暂时先总结到这,现在去吃饭,回来实现窗口的抖动,加油!!!!

关于Socket编写简单聊天工具的总结(原创)的更多相关文章

  1. [更新Github地址]python学习,自己写了个简单聊天工具mychat

    最近在学习python,自己写了个最最简单的聊天工具mychatv0.1. 第一版,完成基本的聊天功能. GUI用的是自带的TKinter,用到的模块主要就是socket(网络编程), thread( ...

  2. C#基于Socket的简单聊天室实践

    序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...

  3. 【总结】学习Socket编写的聊天室小程序

    1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...

  4. 二、socket编写简单BIO的HTTP服务器

    一.目标 诸如tomcat等web服务器中间件简化了我们web的开发成本,但有时候我们或许并不需要这么一个完备的服务器,只是希望做一个简单地处理或者做特殊用途的服务器. 本文将提供一个HTTP的服务器 ...

  5. socket编写简单回显server

    socket在公司代码中应用比较广,比如接口调用的IPCRPC机制,经常看到这样的代码,但是一直也没有动手写过. 在某个比较大的进程中创建一个子进程,由于父子进程复制会浪费内存,可以将创建进程的命令通 ...

  6. c# UDP/TCP协议简单实现(简单聊天工具)

    长时间没有摸这两个协议,写个代码温习下 下面是界面 [服务器界面] [登陆界面] [好友列表界面(我登陆了2个)] [聊天界面] 下面大致讲解下用到的内容 1.用户登陆于服务器通信用到的tcp协议,服 ...

  7. java自己写的简单聊天工具SimpleQQ感悟

    Demo如下: 客户端: /* * 一个简单的QQ * 2013-8-1 * @李志杰 */ package SimpleQQ_Client; import java.awt.*; import ja ...

  8. 用Socket编写的聊天小程序

    Socket是什么? 是套接字,除此之外我也不太清楚,先略过 直接上实例,首先服务端: ; //自定义端口号 private string ServerUser = "Tracy" ...

  9. WPF使用socket实现简单聊天软件

    公司网络限制不能传文件,先贴部分代码 控件添加到界面就行,界面随意布局 项目结构: 1.解决方案 1.1. Client 1.2. Server Client: <Window x:Class= ...

随机推荐

  1. android145 360 进程管理

    package com.itheima.mobileguard.activities; import java.util.ArrayList; import java.util.List; impor ...

  2. 给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大

    题目:给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i <= j)并且j-i最大 ,若有多个这样的位置对,返回i最小的那一对. 最直接的想法就是对于每一个 i 从数 ...

  3. Python学习 之 异常

    1.python中处理异常的方式 #coding:utf8 filename=raw_input("请输入你要操作的文件") try: f=open(filename) print ...

  4. sql server where、group by、order by 执行顺序

    2012-02-07 19:39 先where 条件1,再 group by 条件2再 order by 条件3 如果声明了 GROUP BY 子句,输出就分成匹配一个或多个数值的不同组里. 如果出现 ...

  5. oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

    我们经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INT ...

  6. AngularJS - contorller app module

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. python实现之极简stack和queue

    用python实现一个极简的stack和queue,那是so easy的事情了,简洁易懂,适合小白~ 直接上代码吧: node: class LinkNode: def __init__( self, ...

  8. C# 之 Int16 Int32 Int64 的区别

    Int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数. Int32 值类型表示值介于 -2,147,483,648 到 +2,147,483,647 之间的有符号整数. In ...

  9. 使用SCNetworkReachability判断网络是否连接

    先来看一下整个方法 - (BOOL)isConnectionAvailable { //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态 struct sockaddr_in zeroAdd ...

  10. CF 13E. Holes 分块数组

    题目:点这 跟这题BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊  一模一样 分析: 分块数组入门题. 具体的可以学习这篇博文以及做国家集训队2008 - 苏煜<对块状链表的一 ...