最近因为考试各种复习顺便刷电视剧,感觉跟小伙伴玩的越来越不开心了,一定是最近太闲了,恩。于是想研究一下代理服务器,下载了一份代码,发现竟然还涉及到socket编程,所以把之前网络课的socket聊天室小课设拿出来整理一下思路。

代码参考资料:http://www.oschina.net/code/snippet_1387924_25928

先贴代码:

#coding:utf-8
import socket
import sys
import threading class server(object):
__data='' #定义私有变量
__con=threading.Condition() #创建一个新的Lock对象
__sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket对象 def __init__(self,HOST='localhost',PORT=6008,max_num=10): #初始化socket
self.__sock.bind((HOST, PORT))
self.__sock.listen(max_num) #设定最大监听数量
print '等待接入,侦听端口: ',PORT def __del__(self): #关闭socket
self.__sock.close() def __NotifyAll(self,text):
if self.__con.acquire(): #如果获得锁
self.__data = text
self.__con.notifyAll()
self.__con.release() def __ClientThreadIn(self,conn,nick): #接收消息的进程
while True:
try:
temp = conn.recv(1024)
if not temp:
conn.close()
return
self.__NotifyAll(temp)
print self.__data
except:
self.__NotifyAll("Server: "+ nick + " leaves the room!")
print self.__data
return def __ClientThreadOut(self,conn,nick): #发送消息的进程
while True:
if self.__con.acquire():
self.__con.wait()
if self.__data:
try:
conn.send(self.__data)
self.__con.release()
except:
self.__con.release()
return def main(self):
while True:
conn, addr = self.__sock.accept()
print '接到连接,client ip: ', addr
nick = conn.recv(1024)
self.__NotifyAll('Server: Welcome ' + nick + ' to the room!')
# print str((threading.activeCount() + 1) / 2) + ' person(s)!'
conn.send(self.__data)
threading.Thread(target = self.__ClientThreadIn , args = (conn, nick)).start()
threading.Thread(target = self.__ClientThreadOut , args = (conn, nick)).start() server=server()
server.main()

server.py

#coding: utf-8
import socket
import threading class Client(object):
__nick=''
__inString=''
__outString = ''
__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def __init__(self,port=6008,nick=''):
self.__sock.connect(('localhost', port)) if nick!='':
self.__nick = nick
else:
self.__nick = raw_input("input your nickname: ")
self.__sock.send(self.__nick) def __del__(self):
self.__sock.close() def main(self):
thin = threading.Thread(target = self.__DealIn).start()
thout = threading.Thread(target = self.__DealOut).start() def __DealOut(self):
while True:
self.__outString = raw_input()
self.__outString = self.__nick + ': ' + self.__outString
self.__sock.send(self.__outString) def __DealIn(self):
while True:
try:
self.__inString = self.__sock.recv(1024)
if not self.__inString:
break
if self.__inString!=self.__outString:
print self.__inString
except:
break client=Client()
client.main()

client.py

  1. 代码共分为两部分:client.py、server.py,分别为客户端和服务器端,其中客户端可运行多个。
  2. 服务器端和客户端都用到了socket和thread(线程),采用面向对象的方法编写。
  3. Client.py相对较简单。分析如下:先初始化了昵称信息,并且监听相对应的端口。在成员函数main中声明开两个线程,一个用于发送信息,一个用于接收信息。当没有接收信息的时候,程序在socket.recv()处停止等待。当没有发送消息的时候,程序在raw_input()处停止并等待输入。
  4. Server.py分析如下:先初始化监听端口信息,等待客户端接入。如果检测到client接入,先recv client的昵称信息,并向所有的client发出公告。server为每个连接的client都开了两个进程,分别处理发送和接收。发送函数在获得锁之后,会停止等待,解除当前锁定,切换到接收函数。在没有接收信息的时候,接收函数会在socket.recv()处等待。在接收到client发来的信息之后,调用NotifyAll()函数,取消当前锁定,通知所有发送进程,挨个向client发送信息。

Python socket编程应用的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

  3. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  4. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  5. [Python_7] Python Socket 编程

    0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...

  6. Python Socket 编程示例 Echo Server

    简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...

  7. Python Socket 编程——聊天室演示样例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...

  8. python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  9. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  10. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

随机推荐

  1. 一个IO的传奇一生 系列 存储之道

    http://alanwu.blog.51cto.com/3652632/1286553

  2. php笔记07:http响应详解(禁用缓存设置和文件下载)

    演示如何通过Http响应控制页面缓存,在默认情况下,浏览器是会缓存页面的1.禁用缓存设置 (1).我在...\htdocs\http文件夹,写一个cache.php文件如下: <?php ech ...

  3. Linux环境下搭建Android开发环境

    最近在折腾linux.因为咱是搞安卓开发的,所以少不了需要搭建Android开发环境,就此小记,希望能给向我一样的开发者一点帮助!开干! 1.安装JDK 下载JDK包,得到的是类似于jdk-8u65- ...

  4. 动态添加组件(XML)

    1.利用LayoutInflater的inflate动态加载XMLmLinearLayout = (LinearLayout)findViewById(R.id.LinearLayout_ID);La ...

  5. css position 定位

    fixed 属于绝对定位,相对于浏览器窗口定位 (IE 6不支持)   relative 相对定位,通过设置垂直或水平位置,让这个元素"相对于"它的原始起点进行移动.       ...

  6. ASP.NET MVC(一) 什么是Razor

    Razor 是一种向网页添加基于服务器的代码的标记语法 Razor 不是编程与语言.它是服务端标记语言. 当网页被写入浏览器时,基于服务器的代码能够创建动态内容.在网页加载时,服务器在向浏览器返回页面 ...

  7. iOS开发——友盟分享

    ==========2016-01-29 更新=====刘成利 email:liu_cheng_li@qq.com========== 自己成功集成到公司的项目前,也已做了测试好的友盟分享demo 目 ...

  8. iOS开发——生成二维码——工具类

    啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...

  9. Unity中使用RequireComponent,没有添加上组件

    using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter), typeof(MeshRender ...

  10. 菜鸟笔记之java中方法使用

    N!!!java中无参无返回值方法的使用 1,定义方法 eg: public void show(){ System.out.println("HelloWorld!") } -- ...