socket基础实例(一个服务端对应一个客户端情形)
服务端处理1个客户端的例子
运行结果:
(1) while(accept+if(recv)) 情形
执行服务端进程:
[root@localhost single_link]# ./server
[server]: begin
[server]: loop......
Client[127.0.0.1,]==>Server:
now send data to conn_id
[server]: loop......
Client[127.0.0.1,]==>Server:
now send data to conn_id
[server]: loop......
执行第1个客户端进程,服务端对第2条指令无响应
[root@localhost single_link]# ./client
[client]: begin
connect to dest host..
[Client]: loop......: input your word:>
Server==>Client:
[Client]: loop......: input your word:>
开户第2个客户端,并执行:服务端对第2条指令也无响应
[root@localhost single_link]# ./client
[client]: begin
connect to dest host..
[Client]: loop......: input your word:>
Server==>Client:
[Client]: loop......: input your word:>
(2)第2种情形:accept + while(recv)
这种情形是不正常的,必须避免这种写法。
(3) 第3种情形:while(accept + while(recv))
也是现在我们想要的情形:server与1个client进行交互操作,当第1个client退出时,server会执行while循环体的起始代码,即继续等待下一个client,而不是像第(2)种情形一样,在一个可能不存在的套接字上recv/send数据。
执行服务端:
[root@localhost single_link]# ./server
[server]: begin
[server]: loop......
Client[127.0.0.1,]==>Server:
now send data to conn_id
Client[127.0.0.1,]==>Server:
now send data to conn_id
Client[127.0.0.1,]==>Server:
now send data to conn_id
执行第1个Client:
[root@localhost single_link]# ./client
[client]: begin
connect to dest host..
[Client]: loop......: input your word:>
Server==>Client:
[Client]: loop......: input your word:>
Server==>Client:
[Client]: loop......: input your word:>
Server==>Client:
[Client]: loop......: input your word:> 在第1个client Ctrl+c退出后,如果第2个客户端程序仍未关闭,服务端将会与第2个client进行交互操作:于是有了以下信息:
Client[127.0.0.1,49934]==>Server: 21
now send data to conn_id
[Client]: loop......: input your word:>
然后执行第2个client:
[root@localhost single_link]# ./client
[client]: begin
connect to dest host..
[Client]: loop......: input your word:>
案例总结:
该实例验证的是服务端:客户端=1:1的情形,
从服务端程序逻辑上看,第1个while用于属于accept/connect while循环,完成与client的连接操作,内部的while属于recv/send循环操作,完成与client的数据传输操作。
如果第client1不关闭socket,服务端的recv/send while就不会退出,
所以当第client2连接到server的时候,connec和send都是成功的,但因为服务端正处于与client1的交互中而无法响应send操作,所以client2会block在这里,等待server的数据返回,
这时如题第1个client关闭了,server与client2
socket基础实例(一个服务端对应一个客户端情形)的更多相关文章
- java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing
最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...
- 多个微信小程序一个服务端架构
由于某些特定的业务场景,当多个小程序需要一个服务端后台提供数据时,大家可能想到是HTTP路由.是的,实际上我们使用微服务的GateWay网关也是一样的,如下图微服务架构: 网关GateWay的作用在于 ...
- 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发
''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() clie ...
- Netty 的基本简单实例【服务端-客户端通信】
Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象. 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理. Accept连接和读写 ...
- [经验] Java 服务端 和 C# 客户端 实现 Socket 通信
由于项目需要, 我需要通过 Java 开发的服务端对 C# 作为脚本语言开发的 unity 项目实现控制 话不多说, 直接上代码 首先, 我们先来构建服务端的代码, 服务端我们使用 Java 语言 i ...
- 客户端 new socket时候 就像服务端发起连接了
客户端 new socket时候 就像服务端发起连接了
- 服务端挂了,客户端的 TCP 连接还在吗?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. 如果「服务端挂掉」指的是「服务端进程崩溃」,服务端的进程在发生崩溃的时候,内核会发送 ...
- java网络编程TCP传输—流操作—服务端反馈与客户端接收
在读取完流后,服务端会向客户端返回一些数据,告诉客户端,已经写完了. 在这里和”流操作—拿到源后的写入动作“差不多,客户端同样以byte与Buffered两种缓冲读取作为例子,同时,.也是希望大家给补 ...
- “快的打车”创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - V2EX
"快的打车"创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - ...
随机推荐
- UITableViewCell的重用机制原理
UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...
- JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-003Table per concrete class with unions(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)、<union-subclass>)
一.代码 1. package org.jpwh.model.inheritance.tableperclass; import org.jpwh.model.Constants; import ja ...
- nodejs上传图片并显示的例子
目标 1. 在浏览器地址栏输入“http://demos/start”,进入欢迎页面,页面有一个文件上传表单: 2. 选择一张图片并提交表单,文件被上传到"http://demos/uplo ...
- Golang哲学思想
Golang是一门新语言,经过几年发展,慢慢地也已经被许多大公司认可.最大的特点是速度快,并发性好,与网络的功能结合好,是一门服务端语言,号称“网络时代的新语言”:另外还是一个编译型的Python.不 ...
- Dire Wolf ---hdu5115(区间dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题意:有一排狼,每只狼有一个伤害A,还有一个伤害B.杀死一只狼的时候,会受到这只狼的伤害A和这只 ...
- Ubuntu13.10 eclipse菜单栏无法下拉
Ubuntu13.10 eclipse菜单栏无法下拉 Ubuntu 13.10已经发布,从13.04升级成功后,发现Eclipse菜单栏点击后,不能展示下拉列表了,但是快捷键有效.这个应该算是Ubun ...
- 使用RedisTemplate的操作类访问Redis(转)
深入理解Spring Redis的使用 (三).使用RedisTemplate的操作类访问Redis 事务需要开启enableTransactionSupport,然后使用@transactional ...
- list、set、map的特点
java 集合(list.set.map)的特点 集合相关的类有一大堆,一般也只用到常用的方法增删改查,而且它它们的方法名也基本一样,所以一直都不知道什么时候用什么集合, 今天趁有空特意从网上整理资料 ...
- MyBatis学习总结_19_Mybatis传多个参数(三种解决方案)
据我目前接触到的传多个参数的方案有三种. 第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xm ...
- opencv 人脸识别 (一)训练样本的处理
本文实现基于eigenface的人脸检测与识别.给定一个图像数据库,进行以下步骤: 进行人脸检测,将检测出的人脸存入数据库2 对数据库2进行人脸建模 在测试集上进行recognition 本篇实现 ...