socket多线程编程
① 同步socket, 异步socket, 多线程socket, 多进程socket
socket常用,本文立足同步和异步socket,以及现有的socketserver库。
同步socket一般有利用socket库直接,就可以写出tcp或udp的套接字
socketserver提供的线程或进程方式的socket
利用python 3.5+的asyncio协议,封装一个协程的socket server ,普通的socket客户也可以连接。
服务器端
客户端
为字节流加上自定义固定长度报头,报头中包含字节流长度,然后一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据
构造报头信息
服务端
客户端
粘包,分包都tcp
tcp为什么会有粘包分包这些情况:
1.服务端处理不过来
2.客户端采用优化纳格尔算法,达到一定字节才发
怎么处理:
1. 客,服双方确定包头规范,根据包头的信息取包长度
2. 客户端发送带上标记位,如\n, 服务端根据标记取包
服务器端
客户端
服务器端
客户端
服务器端
客户端
封装了socket,而且解决了Io阻塞问题
服务端
客户端
客户端
参考:
http://www.cnblogs.com/jokerbj/p/7422349.html
http://xiaorui.cc/2016/03/08/%E8%A7%A3%E5%86%B3golang%E5%BC%80%E5%8F%91socket%E6%9C%8D%E5%8A%A1%E6%97%B6%E7%B2%98%E5%8C%85%E5%8D%8A%E5%8C%85bug/
http://xiaorui.cc/2016/04/15/%E6%89%93%E9%80%A0mvc%E6%A1%86%E6%9E%B6%E4%B9%8Bsocket%E8%8E%B7%E5%8F%96http%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/
https://www.jianshu.com/p/065c53cab328
https://mozillazg.com/2017/08/python-asyncio-note-io-protocol.html#hidid3
② mfc socket tcp 多线程编程,一个服务器对多个客户端,跪求代码!
简单的就这样,收到一个连接请求,就生成一个socket负责与客户端通信,
③ C# winForm Socket 多线程 编程 关闭问题
2中方式,除主线程外其他线程设置为后台线程,即background thread,这是线程创建时的一个属性,另一种就是应用程序退出时的事件里手动退出线程
----
void Application_Exit(object sender,args e)
{
//thread.abort();
}
好像是这样写吧,好久没用C#了,有点忘了,MSDN上有详细的说明
socket是非托管资源,我的理解是最好首先清理(在其他线程前);
④ c++ socket编程中的多线程处理问题
你说的有点没看明白,这样的代码结构应该可以吧。不过不会state一变化就停止a操作,一次a操作的流程要执行完,在下次进入循环的时候才会转去执行其他操作。
while() //死循环
{
if(state == 2)
{
//执行其他操作
usleep();//如果没有其他操作,可以睡眠一段时间 比如10ms。
contunue;
}
// a操作
}
⑤ 使用socket编程,实现一个多线程聊天程序,使用9977端口,要求服务端使用两个线程(一个接收,一个输出)
对于通信来说,不存在绝对的服务器和客户端,谁在等待别人来,谁就是服务器,谁主动去联系人,谁就是客户端。
所以。
你要想客户端接受消息,那在启动客户端的时候,在客户端程序里开始一个提供端口的Socket就可以了。
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
final Socket socket = serverSocket.accept();
new Thread() {
Socket mySocket = socket;
@Override
public void run() {
try {
System.out.println(mySocket);
InputStream is = mySocket.getInputStream();
byte[] bytes = new byte[1024];
int n = is.read(bytes);
System.out.println(new String(bytes, 0, n));
OutputStream os = mySocket.getOutputStream();
os.write(("server reply at time " + new Date()
.toString()).getBytes());
mySocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
⑥ socket同步异步多线程问题
1.是多线程,不算异步。
2.BeginAccept是异步,虽然你的程序中用myreset.WaitOne();进入了等待事件的过程。如果不等待事件,就可以继续运行下面的程序了。
我的经验是,这种情况就不用异步。
3.回调当然会消耗系统资源。大数据的话,我建议用线程循环做。
4.同步就会阻塞,异步主线程不阻塞,当需要监听后,还需要做一些其他处理的话,就用异步,如果一切就绪等待连接的,就用同步比较好。
5.委托给了.net框架,内部应该也是线程和阻塞。
路过,不足之处,请继续问。
⑦ c++ 多线程socket编程可以多个线程同时accept数据吗
监听连接都用一个线程就行了,多线程监听是不明智的,监听到之后把创建连接的套接字发送给其他线程通信就行。。。。
⑧ socket如何用多线程实现同时能接收和发送消息
单IP,多线程监听相同端口,不能实现,详见UNPV1,不过使用一个线程监听端口,把结果存入一个对象,然后多线程并发访问这个对象倒是可以实现的
⑨ 关于Socket多线程编程的recv函数问题
建议设个flag,在服务端进这个while后,如果没处理(文件没发送)完毕前,不在进入,或多开几个thread设置不同端口等待接收客户端的要求。