2020年1月13日02-TCPグループチャットサーバーサイドプログラミング

ネットワークプログラミングでは、ソケットプログラミングは最も基本的で、他のすべてのネットワークプログラミングのパッケージは、そのに基づいて入って来ここに画像を挿入説明
たIPv4に代わってAF_INET、ソケットオブジェクト、AF_INET6のIPv6の代わりに、AF_UNIX、UNIXのみ
SOCKET_STREAM代表のTCP。SOCK_DGRAMの代表は、UDP

**クライアント機能なし。サーバ機能の詳細
TCPクライアントがサーバを持っています
。**
ここに画像を挿入説明
ソケットはIP、プロトコル、ポートが先行し、バインドする必要性をモニタリングポートは、それをバインドし、ポートを聞く
と、その後受け入れ、クライアントは、リンクのためのリンクや待機を受け、受けた後、リンク、意志を受け入れます戻り新しいソケットおよびリモートアドレスとポートは、によって返された新しいソケットを介してデータ交換するには、2つのソケットを確立チャンネルとクライアントの間のリンクを確立し、それを受け入れる
ソケットファイルディスクリプタを占有され、返却する必要がなくなっ
ここに画像を挿入説明ここに画像を挿入説明

client通过指定远程的ip端口,尝试和socket进行链接,accept看到有人来链接,会把这个client链接跟一个新的socket建立链接,
client就和new socket 建立链接了
ここに画像を挿入説明
accept和recv会阻塞住,一个主线程阻塞住,就不能变成群聊了,可以使用多线程,accept就扔到一个线程理
ここに画像を挿入説明
tcp server里面开多个线程,把accept放到单独线程里,这样主线程可以进行管理的工作,网络也属于IO,IO密集型就是多线程
ここに画像を挿入説明ここに画像を挿入説明ここに画像を挿入説明ここに画像を挿入説明
也就是现在的版本,有个ChatServer类,创建socket,初始化IP,端口,listen之后要accept,但是accept会阻塞,就需要开一个线程,每accept一次就创建一个新的线程,
ここに画像を挿入説明与客户端连接就创建一个新的线程,把socket传递进去,new socket就管理和客户端的通信问题,如果阻塞,最好的办法就是以后开多线程放进去ここに画像を挿入説明
ここに画像を挿入説明
群聊,就需要记住客户端,就要有个容器存放socket,但是有个删除的过程,就是一个字典ここに画像を挿入説明
元组能不呢个做字典的key就需要看里面的元素是不是可hash
ここに画像を挿入説明
看到的消息群发给客户端ここに画像を挿入説明
运行一下,accept启动 ここに画像を挿入説明
1对1没有问题
ここに画像を挿入説明
另外的也可以收到消息,这就是群聊ここに画像を挿入説明
while TRUE 可以用event代替 ここに画像を挿入説明ここに画像を挿入説明
创建多线程的eventここに画像を挿入説明
所有的while true替换一下
ここに画像を挿入説明
客户端应该有个断开机制,进行收尾的工作,比如客户端发送quit,告诉服务器不想跟你玩了ここに画像を挿入説明
也就是recv拿到消息,要判断这个消息ここに画像を挿入説明ここに画像を挿入説明
可以使用strip,判断后面quit字符串如果加了空格算不算退出,可以把两头的空白字符去掉ここに画像を挿入説明
退出,首先需要把它从字段剔除掉,使用pop(),每个线程启动传入的都是不同的sock和raddr,只要这个线程不退出,sock和raddr都存在
break 以后,,socket关掉,线程就执行完了
ここに画像を挿入説明
pop是有返回值的,可以这么写,但是看起来不舒服,暂时不这么写ここに画像を挿入説明
ここに画像を挿入説明
客户端发送quit,主动退出,就会在列表里把你直接清除掉。然后socket.close,这里是内建数据结构,GIL这把锁,所以多线程可以这么写,但是JAVA就不可以这么写了(因为有可能其他线程正在读,不能pop,有的线程在读,有的线程在写,不加锁是不行的)
ここに画像を挿入説明
发消息两个都收到了,断其中的一个ここに画像を挿入説明
另外一个发送消息,但是收是收到了,有一个小问题ここに画像を挿入説明
问题出在这里
ここに画像を挿入説明
添加一些表明的代码,再次重复刚才的两个链接发消息,然后断开一个ここに画像を挿入説明
现在这里收到一个空的东西,也就是断开的时候,主动发送一个空串ここに画像を挿入説明
、这里报的windows的错误,底层操作系统对socket的实现还是有些不一样的,windows开发的软件
ここに画像を挿入説明
现在发送一个消息,两个客户端都可以收到ここに画像を挿入説明
点这个断开会发送一个空串ここに画像を挿入説明
用自己些的quit
ここに画像を挿入説明
ここに画像を挿入説明
现在就剩一个链接了
ここに画像を挿入説明
现在CS之间进行了一种约定,何时才断开
点软件的断开,就会出现错误ここに画像を挿入説明
收到一个空串
ここに画像を挿入説明
对38行代码进行修改ここに画像を挿入説明
再次点链接断开,只要我们断开,其实就给我们发送一个空串ここに画像を挿入説明
だから、書く、空の文字列または切断されたときに終了する可能性ここに画像を挿入説明
切断今、および与えられていないここに画像を挿入説明
ものを自分自身を書くことであるメカニズムを終了し、もう一方は直接リンクで切断され、サーバーは空の文字列が表示されますので、直接判決空の文字列は、クリーンアップのリソースを実行する時間を外しても可能であり、リストからの削除

ここに画像を挿入説明ここに画像を挿入説明ここに画像を挿入説明
クライアントの切断は、サーバーは知りませんが、ここでは空の文字列を送信します、あなたは切断を決定するためにこれを使用することができますここに画像を挿入説明ここに画像を挿入説明ここに画像を挿入説明ここに画像を挿入説明
形式は最初のfmtでここに画像を挿入説明ここに画像を挿入説明
のみ呼び出し情報を作成し、そこにはハンドラがありませんまたは作成ハンドラを強制した場合の情報後で、ログここに画像を挿入説明ここに画像を挿入説明

公開された130元の記事 ウォンの賞賛5 ビュー40000 +

おすすめ

転載: blog.csdn.net/qq_42227818/article/details/103961014