小例子实现计算机网络通信

使用python进行tcp-socket通信

文章中使用python语言进行编程,实现模拟tcp通信。代码分成客户端和服务器端两部分。希望大家能相互交流学习。

客户端代码

# -*- coding:UTF-8 -*-
import os
import socket
import threading
import time
import signal

def SendDataToServer(sock):
    while True:
        put = str(raw_input())
        sock.send(put)

def ReceiveData(sock):
    while True:
        try:
            data = sock.recv(1024)
            time.sleep(1)
        except:
            print "Server Down!"
            os._exit(0)
        else:
            if data:
                print "RECEIVE:",data

if __name__ == "__main__":
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 8008))
    send_tick = threading.Thread(target=SendDataToServer, args=(s,))
    rec_tick = threading.Thread(target=ReceiveData, args=(s,))
    send_tick.start()
    rec_tick.start()

服务器端代码

#!/usr/bin/env python
#*-* coding:utf-8 *-*
import select
import socket
import Queue
import time
import os

class Server():
    #
    def __init__(self):
        self.server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.server.setblocking(False)
        #
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_address= ('127.0.0.1',8008)
        self.server.bind(self.server_address)
        self.server.listen(10)
        self.inputs = [self.server]
        self.outputs = []
        self.message_queues = {}
        #timeout = 20

    def run(self):
        while self.inputs:
            print "=================================="
            print "waiting for next event"
            print "inputs",self.inputs
            print "outputs",self.outputs
            print "queue", self.message_queues
        #readable , writable , exceptional = select.select(inputs, outputs, inputs, timeout) 
            readable , writable , exceptional = select.select(self.inputs, self.outputs, self.inputs)
            print "readable , writable , exceptional",readable , writable , exceptional
            # When timeout reached , select return three empty lists
            if not (readable or writable or exceptional) :
                print "Time out ! "
                break;
            for s in readable :
                if s is self.server:
                    #
                    connection, client_address = s.accept()
                    print "    connection from ", client_address
                    connection.setblocking(0)
                    self.inputs.append(connection)
                    self.message_queues[connection] = Queue.Queue()
                else:
                    try:
                        data = s.recv(1024)
                    except:
                        print "  closing", client_address
                        if s in self.outputs :
                            self.outputs.remove(s)
                        self.inputs.remove(s)
                        s.close()
                        #
                        del self.message_queues[s]
                    else:
                        if data :
                            print " received " , data , "from ",s.getpeername()
                            self.message_queues[s].put(data)
                            # Add output channel for response
                            if s not in self.outputs:
                                self.outputs.append(s)
            for s in writable:
                try:
                    next_msg = self.message_queues[s].get_nowait()
                except Queue.Empty:
                    print " " , s.getpeername() , 'queue empty'
                    self.outputs.remove(s)
                else:
                    print " sending " , next_msg , " to ", s.getpeername()
                    os.popen('sleep 5').read()
                    s.send(next_msg)

            for s in exceptional:
                print " exception condition on ", s.getpeername()
                #stop listening for input on the connection
                self.inputs.remove(s)
                if s in self.outputs:
                    self.outputs.remove(s)
                s.close()
                #
                del self.message_queues[s]

if __name__ == "__main__":
    s = Server()
    s.run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值