angrykola

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

首先通过socket建立一个TCP时间戳服务器:

 2 # -*- coding: utf-8 -*-
 3 '''
 4 创建一个能接收客户的消息,在消息前加一个时间戳后返回的TCP服务器。
 5 '''
 6 from socket import *
 7 from time import ctime
 8 
 9 HOST = ''      #HOST 变量为空,表示 bind()函数可以绑定在所有有效的地址上。         
10 PORT = 21567   #选用了一个随机生成的未被占用的端口号。
11 BUFSIZ = 1024  #缓冲的大小设定为 1K,实际情况可以根据需要修改
12 ADDR =(HOST,PORT)
13 tcpSerSock = socket(AF_INET, SOCK_STREAM) 
14 tcpSerSock.bind(ADDR)  #将套接字绑定到服务器的地址上
15 tcpSerSock.listen(5)  
16 #listen()函数的参数只是表示最多允许多少个连接同时连进来,后来的连接就会被拒绝掉。 
17 
18 
19 '''
20 在进入到服务器的无限循环后,我们(被动地)等待连接的到来。
21 当有连接时,我们进入对话循环,等待客户发送数据。
22 如果消息为空,表示客户已经退出,那就再去等待下一个客户的连接。
23 得到客户的消息后,我们在消息前加一个时间戳然后返回。
24 最后一行不会被执行到,放在这里用于提醒读者,在服务器要退出的时候,要记得调用 close()函数。
26 '''
27 while True:
28     print('waiting for connection...')
29     tcpCliSock,addr = tcpSerSock.accept()
30     print('...connected form:',addr)
31 
32 while True:
33     data = tcpCliSock.recv(BUFSIZ)
34     if not data:
35         break
36     tcpCliSock.send('[%s] %s'%(ctime(),data))
37 
38 tcpCliSock.close()
39 tcpSerSock.close()

然后建立一个对应的TCP客户端:

 1 from socket import *
 2 
 3 HOST = 'localhost'
 4 PORT = 21567
 5 BUFSIZ = 1024
 6 ADDR = (HOST,PORT) 
 7 '''
 8 HOST 和 PORT 变量表示服务器的主机名与端口号。
 9 由于我们在同一台电脑上进行测试,所以 HOST里放的是本机的主机名
10 (如果你的服务器运行在其它电脑上,要做相应的修改)。
11 端口号要与服务器上的设置完全相同(不然就没办法通讯)。
12 缓冲区的大小还是设为 1K。
13 '''
14 
15 tcpCliSock = socket(AF_INET,SOCK_STREAM) #创建TCP 客户套接字(tcpCliSock)
16 tcpCliSock.connect(ADDR)                 #链接服务器
17 
18 while True:
19     '''
20     客户端也有一个无限循环,
21 客户端的循环在以下两个条件的任意一个发生后就退出:
22 用户没有输入任何内容,或服务器由于某种原因退出,
23 导致 recv()函数失败。否则,在一般情况下,客户端会把用户输入的字符串
24 发给服务器进行处理,然后接收并显示服务器传回来的,加了时间戳的字符串。 
25     '''
26     data = input('>')
27     if not data:
28         break
29     tcpCliSock.send(data)
30     data = tcpCliSock.recv(BUFSIZ)
31     if not data:
32         break
33     print (data) 
34 
35 tcpCliSock.close()   

然后一次运行服务器,客户端程序:

注意,先运行服务器,否则客户端无法连接上服务器会报出异常:

>>> ================================ RESTART ================================
>>> 
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\TCP客户端.py", line 19, in <module>
    tcpCliSock.connect(ADDR)                 #链接服务器
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

下面是链接成功后的结果:

#服务器端显示已经连接上
>>> 
waiting for connection...
('...connected form:', ('127.0.0.1', 7755))
waiting for connection...

稍微有些小问题,还在解决,发送的时候报了个异常,正在解决

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\TCP客户端.py", line 26, in <module>
    tcpCliSock.send(data)
TypeError: 'str' does not support the buffer interface

 结果在python2.7上测试没问题,是python3字符编码出了问题。

posted on 2013-11-26 00:36  kolaman  阅读(1680)  评论(1)    收藏  举报